这个java日期格式化程序出了什么问题



我正在尝试将您在下面代码中看到的日期格式化为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日期格式化程序出了什么问题

  • EEEEMonday一样表示一周中某一天的全名。对于类似Mon的缩写,您需要EEEEEE
  • 正如其他人所说,小写hh表示从0112的AM或PM内的时钟小时,因此无法解析00的小时。即使可以,它也无法提供足够的信息。对于从0023的一天中的某个小时,您需要大写HH
  • Basil Bourque在评论中已经提到了一个更基本的问题:解析像COT这样的时区缩写的结果通常是未定义的。虽然COT可能只有一个定义,但我不知道,大多数最常见的缩写都是模糊的,你不知道解析它们会得到什么
  • 如前所述,您的格式化程序不能用于格式化LocalDateTimeLocalDateTime没有任何时区。格式化程序需要一个时区作为缩写时区名称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.Date类的toString方法。要从那里解析字符串,请查看底部链接到的其中一个答案。或者更好的方法是,获取Date对象,使用其toInstant方法将其转换为现代Instant,并从中执行任何进一步的转换。或者更好的是,完全停止使用Date

链接

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

  • Arvind Kumar Avinash的回答
  • Arvind Kumar Avihash的回答
  • Arvind Kumar Avinash的回答
  • 我的答案
  • Basil Bourque的回答
  • 当然还有恐怖袋熊对这个问题的回答

相关内容

  • 没有找到相关文章

最新更新