【问题标题】:String from ZonedTimeDate to java.util.Date without name of the month and day [duplicate]从 ZonedTimeDate 到 java.util.Date 的字符串,没有月份和日期的名称[重复]
【发布时间】:2021-08-23 18:51:32
【问题描述】:

我使用ZonedDateTime 来获取当前日期时间。因为我不想要它,所以我将它设为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... 我该怎么做 将我的字符串转换为日期并保持日期看起来像字符串?

【问题讨论】:

  • 为什么需要java.util.Date?顺便说一句,该类没有格式。您看到的是应用默认格式化程序的结果。您应该使用自己的格式化程序和String s = formatter1.format(date)
  • 如何使用另一个日期类来做到这一点?
  • 仍然不知道为什么需要util.Date
  • 可以将ZonedDateTime 转换为Instant,它具有toDate() 方法。然而,你说你想要一个Date,但你没有解释你为什么想要这个。对我来说,这看起来像是一个 XY 问题。
  • 我建议您既不要使用SimpleDateFormat,也不要使用Date。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用LocalDate 和可能来自java.time, the modern Java date and time API 的其他类。

标签: java date datetime


【解决方案1】:

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 对象是日期时间对象,不是文本,也不是 Stringjava.util.Date 对象没有“格式”。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多