【问题标题】:Cant parse recently formatted ZonedDateTime Java 8无法解析最近格式化的 ZonedDateTime Java 8
【发布时间】:2015-11-25 14:11:12
【问题描述】:

为什么是这个代码

DateTimeFormatter SENT_DATE_FORMATTER = DateTimeFormatter.ofPattern("E, d MMM YYYY HH:mm:ss Z", Locale.US);
ZonedDateTime now = ZonedDateTime.now();
String dateStr = now.format(SENT_DATE_FORMATTER);
System.out.println(dateStr);

ZonedDateTime zoned = ZonedDateTime.parse(dateStr, SENT_DATE_FORMATTER);

在 sysout 行上打印正确的日期,但在解析行上抛出 DateTimeParseException(无法从 TemporalAccessor 获得 ZonedDateTime)?

【问题讨论】:

标签: java date


【解决方案1】:

大写的 Y 代表基于周的年份,请参阅 javadoc。为了使解析器正常工作,您需要将其更改为年份 (u) 或年份 (y)。然后解析器可以创建日历年、月 (M) 和月日 (d) 之外的日期。请记住,如果您的月份和日期接近日历年的开始或结束,则基于周的年份可能与上一个或下一个日历年相关,而不是实际年份。因此,不可能仅将基于周的年份与日历年相等! 如果没有精确定义的日历年,就不可能形成日期。

否则,如果您的模式中也有基于周的年份 (w),那么您的解析器将能够理解输入,因为基于周的年份 (Y)、周-week-based-year (w) 和 day-of-week (E) 也可以作为日期的可解释组合。

但是请注意,与您的模式匹配的输入中的所有给定详细信息必须一致(例如 2015-08-31 是星期一而不是星期二)否则解析器会再次抱怨(至少在严格模式下)。

【讨论】:

  • 非常感谢。我花了很多时间寻找奇怪的解决方案,我没有注意到大写的 Y
  • @Solci 检测这种错误的方法是测试工作代码的 sn-p。然后与你自己的比较,直到你看到你的错误。 StackOverflow 上发布了数百个此类示例。
猜你喜欢
  • 2020-11-27
  • 2016-09-12
  • 2020-09-20
  • 2020-12-15
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多