2

我正在使用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”:无效日期“FEBRUARY 31”

文档 几乎_暗示了这一点,“字符串必须代表一个有效的日期”仅在无格式化方法中提到。

如何使用threeten bp 以自定义格式(如 31/02/1985)验证日期?

4

1 回答 1

3

主要区别可以解释为 ISO_LOCAL_DATE 格式化程序默认情况下是严格的。其他格式化程序默认是智能的。您引用的完整句子如下所示:

该字符串必须代表一个有效的日期,并使用 DateTimeFormatter.ISO_LOCAL_DATE 进行解析。

所以很明显,无格式方法只能在严格模式下解析与 ISO 兼容的日期,即使这样也只能解析 ISO -8601 的一个子集,即:

uuuu-MM-dd或者uuuuMMdd

关于严格模式,你可以看到它研究源代码

   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)

于 2015-09-28T07:32:00.887 回答