我使用的是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日”
文档几乎是用“字符串必须表示有效日期”来暗示这一点的,只有在无格式化程序方法中提到过。
如何使用三层bp以自定义格式(如31/02/1985 )验证日期?
发布于 2015-09-28 07:32:00
主要的区别可以解释为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)。
https://stackoverflow.com/questions/32812262
复制相似问题