没有时间的日期不会隐藏秒

Posted

技术标签:

【中文标题】没有时间的日期不会隐藏秒【英文标题】:Date without time doesn't hide seconds 【发布时间】:2020-11-04 16:33:53 【问题描述】:

我正在使用 Joda Time 从日期中删除秒数。

首先,我有这种Date

Thu Nov 05 00:00:00 CET 2020

我使用这种方法从本地数据库中选择这个日期:

public static Date dateTimeFromString(String s) 

    String pattern = "yyyy-MM-dd";
    SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    Date d= null;
    try 
        d = sdf.parse(s);
     catch (ParseException e) 
        e.printStackTrace();
    
    return d;

从今天开始,我会得到这样的表格:

Thu Nov 05 CET 2020

或者更好的是:Thu Nov 05 2020

现在,我正在尝试使用Joda Time:中的这种方法

private Date dateWitoutTime(Date date)
    return new LocalDate(date).toDate();

但还是得到了

Thu Nov 05 00:00:00 CET 2020

有什么帮助吗?谢谢。

【问题讨论】:

你的方法返回一个Date。输出似乎是Date.toString()Date 包括时间。你真的想从dateWithoutTime(...)返回DateString吗? 我想要String,但我不想要HH:mm:ss。我用那个方法是因为它来自Joda Time 将时间转换为 LocalDate 然后再次转换为 Date 来删除时间是没有意义的,因为 Date 总是包含时间,即使它是 00:00。您要么保留 LocalDate 对象并使用它,要么在打印出 Date 对象时指定所需的格式 这是否以某种方式回答了您的问题? want current date and time in “dd/MM/yyyy HH:mm:ss.SS” format. 【参考方案1】:

不要使用旧的容易出错的 java.util 日期时间 API 污染干净的 java.time API。您可以使用modern date-time API:

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main 
    public static void main(String[] args) 
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now.format(DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm", Locale.ENGLISH)));
        System.out.println(now.format(DateTimeFormatter.ofPattern("EEE MMM dd uuuu", Locale.ENGLISH)));

        DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z uuuu", Locale.ENGLISH);
        ZonedDateTime givenDateTime = ZonedDateTime.parse("Thu Nov 05 00:00:00 CET 2020", dtfInput);

        DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("EEE MMM dd z uuuu", Locale.ENGLISH);
        System.out.println(givenDateTime.format(dtfOutput));
        System.out.println(ZonedDateTime.now(ZoneId.of("Europe/Paris")).format(dtfOutput));
    

输出:

04-Nov-2020 17:13
Wed Nov 04 2020
Thu Nov 05 CET 2020
Wed Nov 04 CET 2020

通过 Trail: Date Time 了解有关现代日期时间 API 的更多信息。

使用旧版 API:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

public class Main 
    public static void main(String[] args) throws ParseException 
        Date now = new Date();
        System.out.println(new SimpleDateFormat("dd-MMM-yyyy HH:mm", Locale.ENGLISH).format(now));
        System.out.println(new SimpleDateFormat("EEE MMM dd yyyy", Locale.ENGLISH).format(now));

        SimpleDateFormat sdfInput = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
        Date givenDateTime = sdfInput.parse("Thu Nov 05 00:00:00 CET 2020");

        SimpleDateFormat sdfOutput = new SimpleDateFormat("EEE MMM dd z yyyy", Locale.ENGLISH);
        sdfOutput.setTimeZone(TimeZone.getTimeZone("CET"));
        System.out.println(sdfOutput.format(givenDateTime));
        System.out.println(sdfOutput.format(now));
    

输出:

04-Nov-2020 17:13
Wed Nov 04 2020
Thu Nov 05 CET 2020
Wed Nov 04 CET 2020

【讨论】:

【参考方案2】:

如果您使用的是 Java8+,则不需要 JodaTime。

Date 实例包含时间;没有办法解决这个问题。也许您想返回 String

    // Pre-Java8
    private String dateWithoutTime(final Date date) 
        final SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM d yyyy");
        return sdf.format(date);
    

    // Java8+
    private String dateWithoutTime(final LocalDate date) 
        final DateTimeFormat formatter = DateTimeFormatter.ofPattern("EEE MMM d yyyy");
        return date.format(formatter);
    

    private String dateWithoutTime(final Date date) 
        final LocalDate localDate = convertDateToLocalDate(date);
        return dateWithoutTime(localDate);
    

    private LocalDate convertDateToLocalDate(final Date date) 
        ...
    

【讨论】:

请不要教年轻人使用早已过时且臭名昭著的麻烦SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。 Yje OP 已经在使用 Joda-Time,它的性能要好得多(Java 8+ 与否)。 Joda-Time 包括用于格式化日期的类 DateTimeFormatDateTimeFormatter,因此我建议您改用它们。或者更好的是,转到 java.time 和 DateTimeFormatter 我不同意你的说法,即如果你已经在使用 Java8,Joda-Time 就更好了。 感谢您的评论。我对分歧完全没问题,对你的意见非常好奇。我说 Joda-Time 优于 SimpleDateFormat。你误会了吗?或者您是否认为SimpleDateFormat 从 Java 7 到 Java 8 已经有了很大的改进,如果是这样,如何改进?也感谢您的编辑,我认为这是一个很好的改进。 我没有读到你原来的声明,因为“Joda-Time 优于 SimpleDateFormat”;我认为即使java.time 可用,也应该使用它。感谢您的回复和反馈。【参考方案3】:

我想要String,……

嗯,从一种字符串格式转换为另一种字符串格式是有问题的。就像您在 int 变量中保留数字和在 boolean 变量中保留布尔值一样(我希望如此),您应该在 LocalDate 变量中保留日期,无论是来自 Joda-Time 的 LocalDate 类还是来自 java.time 的类,取代 Joda-Time 的现代 Java 日期和时间 API。但是既然你问了,那就让你的方法返回一个String

private static final DateTimeFormatter dateFormatter
        = DateTimeFormat.forPattern("EEE MMM dd yyyy").withLocale(Locale.ENGLISH);

public static String dateTimeFromString(String s) 
    LocalDate date = LocalDate.parse(s);
    return date.toString(dateFormatter);

让我们试试吧:

    System.out.println(dateTimeFromString("2020-11-05"));

输出:

2020 年 11 月 5 日星期四

我已经为格式化程序指定了一个区域设置,以确保打印的缩写是英文。

您不能有DateLocalDate 打印为Thu Nov 05 2020。这些类的toString 方法被定义为打印特定格式。您只能在String 中使用您选择的格式。这很好:它有助于将模型和演示文稿分开。

【讨论】:

以上是关于没有时间的日期不会隐藏秒的主要内容,如果未能解决你的问题,请参考以下文章

Jquery Datepicker 没有隐藏过去的日期

s-s-rS 动态 - 如果父参数被隐藏,则父参数不会传递给子参数

软输入键盘隐藏编辑文本

PHP链接两个下拉菜单:首先向用户显示->提交秒值[隐藏]

隐藏luxon中的无效日期

如何在代码隐藏中为 Datepicker 设置日期/获取日期