这个 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
这样的缩写,您需要 E
、EE
或 EEE
.
- 正如其他人所说,小写
hh
表示从 01
到 12
的上午或下午的时钟小时,因此无法解析您的 00
小时。即使可以,它也无法提供一天中的足够信息。对于从 00
到 23
的一天中的小时,您需要大写 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
区别是 Wednesday
和 12
,所以模式中的错误似乎在 EEEE
和 hh
。
你的字符串好像是用过时的java.util.Date
class的toString
方法出来的。要从那里解析字符串,请参阅底部链接的答案之一。或者更好的是,获取 Date
object,使用其 toInstant
方法将其转换为现代 Instant
并从那里执行任何进一步的转换。或者更好,完全停止使用 Date
。
链接
如何解析 Date.toString()
的结果:
我正在尝试将您在下面的代码中看到的日期格式化为字符串,以便能够将其作为 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
这样的缩写,您需要E
、EE
或EEE
.- 正如其他人所说,小写
hh
表示从01
到12
的上午或下午的时钟小时,因此无法解析您的00
小时。即使可以,它也无法提供一天中的足够信息。对于从00
到23
的一天中的小时,您需要大写HH
. - Basil Bourque 在评论中已经提到了一个更基本的问题:解析像
COT
这样的时区缩写的结果通常是未定义的。虽然COT
可能只有一个定义,但我不知道,大多数最常见的缩写都是模棱两可的,你不知道解析它们会得到什么。 - 如前所述,您的格式化程序不能用于格式化 a
LocalDateTime
。 ALocalDateTime
没有任何时区。格式化程序需要时区缩写名称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
区别是 Wednesday
和 12
,所以模式中的错误似乎在 EEEE
和 hh
。
你的字符串好像是用过时的java.util.Date
class的toString
方法出来的。要从那里解析字符串,请参阅底部链接的答案之一。或者更好的是,获取 Date
object,使用其 toInstant
方法将其转换为现代 Instant
并从那里执行任何进一步的转换。或者更好,完全停止使用 Date
。
链接
如何解析 Date.toString()
的结果: