首页 > 解决方案 > 从 ZonedTimeDate 到 java.util.Date 的字符串,没有月份和日期的名称

问题描述

我正在使用 aZonedDateTime来获取当前的日期时间。因为我不希望它随着时间的推移而出现,所以我将它的格式设置为uuuu-MM-dd它给我一个字符串作为2021-08-23

ZonedDateTime zdt = ZonedDateTime.now(ZoneId.systemDefault());
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu-MM-dd" ); 
String date_string = zdt.format(formatter);
System.out.println(date_string);//2021-08-23

现在如何将此字符串转换2021-08-23为 java.util.Date?我希望日期看起来完全像字符串...这是我尝试过的,但它不会让我的日期看起来像字符串

SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd");
Date date = formatter1.parse(date_string); 

将以这种格式给我日期:Mon Aug 23 00:00:00 EEST 2021...如何将我的字符串转换为日期并保持日期看起来像字符串?

标签: javadatedatetime

解决方案


tl;博士

LocalDate.now().toString()

2021-08-23

最好指定所需/预期的时区,而不是隐式依赖 JVM 当前的默认时区。

LocalDate.now( ZoneId.of( "Africa/Tunis" ) ).toString()

细节

LocalDate

如果您想要仅日期,请使用LocalDate.

LocalDate ld = myZonedDateTime.toLocalDate() ;

java.time.Date门课有很大的缺陷,应该避免。该类在几年前被JSR 310 中定义的现代java.time类所取代。

如果您必须使用此类与尚未更新到java.time的旧代码互操作,您可以在旧类及其替换之间来回转换。寻找添加到旧类的新转换方法。

java.util.Date不是约会

了解它的许多缺陷之一是java.util.Date. 该类代表的不是日期,而是 UTC 中的某个时刻。所以它的替代品是java.time.Instant,不是LocalDate

java.util.Date d = java.util.Date.from( myZonedDateTime.toInstant() );

您询问:

如何将我的字符串转换为日期并保持日期看起来像字符串?

了解这些日期时间类都不是文本。它们有自己内部定义的日期时间值表示,而不是String.

听起来您只需要标准 ISO 8601 格式 (YYYY-MM-DD) 的文本作为仅日期值。java.time类在生成/解析字符串时默认使用标准 ISO 8601 格式。因此无需定义自定义格式模式。

String output = myZonedDateTime.toLocalDate().toString() ;

日期时间对象没有格式,不是文本

您询问:

现在如何将此字符串 2021-08-23 转换为 java.util.Date?我希望日期看起来完全像字符串

你的要求毫无意义。

对象是java.util.Date日期时间对象,不是文本,也不是String. java.util.Date对象没有“格式” 。

同样,java.time.ZonedDateTime对象是日期时间对象,不是文本,也不是String. java.time.ZonedDateTime 对象没有“格式” 。

同样,java.time.LocalDate对象是日期对象,不是文本,不是String. java.time.LocalDate 对象没有“格式” 。

这些日期时间对象具有使用默认格式生成表示嵌入值的文本的toString方法。但是您不应该将生成的文本与原始日期时间对象混为一谈。


推荐阅读