为什么这段代码
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)?
答案 0 :(得分:2)
大写Y代表以周为基础的年份,见javadoc。为了使解析器工作,您需要将其更改为年(u)或年(y)。然后,解析器可以创建日历年,月(M)和日期(d)之外的日期。请记住,如果您的月份和日期接近日历年的开始或结束,则基于周的年份可以与上一个或下一个日历年相关,而不是实际的年份。因此,不可能只是将基于周的年份与日历年相等! 如果没有精确定义的日历年,则无法确定日期。
否则,如果您的模式中也有基于星期的周(w),那么您的解析器将能够理解输入,因为基于周的年(Y),周 - 基于周的年(w)和星期几(E)也可以为日期提供可解释的组合。
但是请注意,与您的模式匹配的输入中的所有给定细节必须一致(例如2015-08-31是星期一而不是星期二)否则解析器将再次抱怨(至少在严格模式下)。