我正在使用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)的日期?
最佳答案
主要区别可以通过以下事实来解释:ISO_LOCAL_DATE 格式默认情况下是严格的。其他格式化程序有 smart默认情况下。您引用的完整句子如下:
The string must represent a valid date and is parsed using DateTimeFormatter.ISO_LOCAL_DATE.
所以很明显,无格式化程序的方法只能在严格模式下解析 ISO 兼容的日期,即使这样也只能是 subset of ISO-8601 ,即:
uuuu-MM-dd
或 uuuuMMdd
关于严格模式,可以看学习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) .
关于java - 三十ABP : How to validate date using a custom date format/DateTimeFormatter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32812262/