为什么要写这段代码
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)?
最佳答案
大写的 Y 代表基于周的年份,参见 javadoc .为了使解析器正常工作,您需要将其更改为年份 (u) 或年份 (y)。然后解析器可以创建日历年、月 (M) 和月中日 (d) 之外的日期。请记住,如果您的月份和日期接近日历年的开始或结束,那么基于周的年份可能与上一个或下一个日历年相关,而不是实际的日历年。因此,不可能将基于周的年份与日历年相等! 如果没有精确定义的日历年,就不可能形成日期。
否则,如果您的模式中也有基于星期几的年份 (w),那么您的解析器将能够理解输入,因为基于星期的年份 (Y)、星期的-week-based-year (w) 和 day-of-week (E) 也可以作为日期的可解释组合。
但是请注意,输入中与您的模式匹配的所有给定详细信息必须一致(例如 2015-08-31 是星期一而不是星期二)否则解析器将再次报错(至少在严格模式下)。
关于java - 无法解析最近格式化的 ZonedDateTime Java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32312993/