没有时间的日期不会隐藏秒
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(...)
返回Date
或String
吗?
我想要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 包括用于格式化日期的类 DateTimeFormat
和 DateTimeFormatter
,因此我建议您改用它们。或者更好的是,转到 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 日星期四
我已经为格式化程序指定了一个区域设置,以确保打印的缩写是英文。
您不能有Date
或LocalDate
打印为Thu Nov 05 2020
。这些类的toString
方法被定义为打印特定格式。您只能在String
中使用您选择的格式。这很好:它有助于将模型和演示文稿分开。
【讨论】:
以上是关于没有时间的日期不会隐藏秒的主要内容,如果未能解决你的问题,请参考以下文章