我正在使用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'
documentation 几乎暗示了这一点,“字符串必须代表一个有效的日期”,仅用格式化程序方法提及。
如何使用threeten bp以自定义格式验证日期,例如31/02/1985?
答案 0 :(得分:2)
主要区别可以解释为ISO_LOCAL_DATE格式化程序默认是严格的。其他格式化程序默认为smart。你引用的完整句子如下:
字符串必须表示有效日期并使用解析 DateTimeFormatter.ISO_LOCAL_DATE。
很明显,无格式化程序的方法只能在严格模式下解析ISO兼容日期,即使只有subset of ISO-8601,也就是:
shared preferences
或uuuu-MM-dd
关于严格模式,您可以看到它正在研究source code:
uuuuMMdd
但是,严格模式似乎没有很好的记录。无论如何,如果你想用自定义格式化程序实现严格模式,那么只需调用它的方法withResolverStyle(ResolverStyle.STRICT)。