我正在使用ThreeTenABP并且似乎遇到了localdate.parse(string)和localdate.parse(string,datetimeformatter)之间的实现差异。

LocalDate.parse("31/02/1985", DateTimeFormatter.ofPattern("dd/MM/yyyy"))

解析为“1985-02-28”,没有抛出异常。
LocalDate.parse("2015-02-31")

DateTimeParseException:无法分析文本“2015-02-31”:无效日期“2月31日”
documentation几乎意味着“字符串必须表示有效日期”,只有在使用无格式化程序的方法时才提到这一点。
如何使用310 bp以自定义格式(如1985年2月31日)验证日期?

最佳答案

主要的区别可以解释为iso_local_date-formatter在默认情况下是严格的。默认情况下,其他格式化程序smart。你引用的完整句子如下:
字符串必须表示有效日期,并使用
datetimeformatter.iso_本地日期。
因此很明显,无格式化程序的方法只能在严格模式下解析与iso兼容的日期,甚至只能解析subset of ISO-8601,即:
uuuu-MM-dduuuuMMdd
关于严格模式,您可以看到它正在研究source code

   public static final DateTimeFormatter ISO_LOCAL_DATE;
   static {
     ISO_LOCAL_DATE = new DateTimeFormatterBuilder()
       .appendValue(YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
       .appendLiteral('-')
       .appendValue(MONTH_OF_YEAR, 2)
       .appendLiteral('-')
       .appendValue(DAY_OF_MONTH, 2)
       .toFormatter(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);
     }

然而,严格模式似乎没有很好的记录。无论如何,如果您想用自定义格式化程序实现严格模式,那么只需调用它的方法withResolverStyle(ResolverStyle.STRICT)

07-24 09:49
查看更多