我正在尝试将您在下面代码中看到的日期格式化为String,以便将其作为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:文本'11月18日星期三00:00:00 COT无法在索引0 处分析"2020">
如果您想使用Zones进行往返解析/格式化,请尝试
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
的AM或PM内的时钟小时,因此无法解析00
的小时。即使可以,它也无法提供足够的信息。对于从00
到23
的一天中的某个小时,您需要大写HH
- Basil Bourque在评论中已经提到了一个更基本的问题:解析像
COT
这样的时区缩写的结果通常是未定义的。虽然COT
可能只有一个定义,但我不知道,大多数最常见的缩写都是模糊的,你不知道解析它们会得到什么 - 如前所述,您的格式化程序不能用于格式化
LocalDateTime
。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
类的toString
方法。要从那里解析字符串,请查看底部链接到的其中一个答案。或者更好的方法是,获取Date
对象,使用其toInstant
方法将其转换为现代Instant
,并从中执行任何进一步的转换。或者更好的是,完全停止使用Date
。
链接
如何解析Date.toString()
:的结果
- Arvind Kumar Avinash的回答
- Arvind Kumar Avihash的回答
- Arvind Kumar Avinash的回答
- 我的答案
- Basil Bourque的回答
- 当然还有恐怖袋熊对这个问题的回答