这个 java 日期格式器有什么问题?

What is wrong with this java date formatter?

我正在尝试将您在下面的代码中看到的日期格式化为字符串,以便能够将其作为 LocalDateTime 对象,但出现异常,我正在按照本指南进行操作 https://mkyong.com/java8/java-8-how-to-convert-string-to-localdate/,但不幸的是它没有像我下面的日期这样的例子,有人可以帮我一下吗?我真的很感激:)

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE MMM d hh:mm:ss zzz yyyy",   Locale.US);
String date = "Wed Nov 18 00:00:00 COT 2020";
LocalDateTime localDateTime = LocalDateTime.parse(date, formatter);
System.out.println(localDateTime);
System.out.println(formatter.format(localDateTime));

我得到:

java.time.format.DateTimeParseException: Text 'Wed Nov 18 00:00:00 COT 2020' could not be parsed at index 0

如果你想往返 parsing/formatting 带 Zones try

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy",   Locale.US);
    String date = "Wed Nov 18 00:00:00 COT 2020";
    ZonedDateTime localDateTime = ZonedDateTime.parse(date, formatter);
    System.out.println(localDateTime);
    System.out.println(formatter.format(localDateTime));

回答标题中的问题,这个 Java 日期格式化程序有什么问题?

  • EEEE 是星期几的全称,如 Monday。对于像 Mon 这样的缩写,您需要 EEEEEE.
  • 正如其他人所说,小写 hh 表示从 0112 的上午或下午的时钟小时,因此无法解析您的 00 小时。即使可以,它也无法提供一天中的足够信息。对于从 0023 的一天中的小时,您需要大写 HH.
  • Basil Bourque 在评论中已经提到了一个更基本的问题:解析像 COT 这样的时区缩写的结果通常是未定义的。虽然 COT 可能只有一个定义,但我不知道,大多数最常见的缩写都是模棱两可的,你不知道解析它们会得到什么。
  • 如前所述,您的格式化程序不能用于格式化 a LocalDateTime。 A LocalDateTime 没有任何时区。格式化程序需要时区缩写名称 zzz。您可以格式化 ZonedDateTime,或者您可以使用其 withZone 方法修改格式化程序以具有覆盖区域。

提示:当您不知道为什么 解析 失败时,请尝试 格式化 使用相同格式化程序的预期值并比较结果到您要解析的字符串。大多数情况下,差异会引导您走上正确的轨道。像这样:

    ZonedDateTime val = ZonedDateTime.of(
            2020, 11, 18, 0, 0, 0, 0, ZoneId.of("America/Bogota"));
    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("EEEE MMM d hh:mm:ss zzz yyyy", Locale.US);
    String toBeParsed = "Wed Nov 18 00:00:00 COT 2020";
    String formatted = val.format(formatter);
    System.out.println("String to be parsed: " + toBeParsed);
    System.out.println("Formatted string:    " + formatted);

输出:

String to be parsed: Wed Nov 18 00:00:00 COT 2020
Formatted string:    Wednesday Nov 18 12:00:00 COT 2020

区别是 Wednesday12,所以模式中的错误似乎在 EEEEhh

你的字符串好像是用过时的java.util.Dateclass的toString方法出来的。要从那里解析字符串,请参阅底部链接的答案之一。或者更好的是,获取 Date object,使用其 toInstant 方法将其转换为现代 Instant 并从那里执行任何进一步的转换。或者更好,完全停止使用 Date

链接

如何解析 Date.toString() 的结果: