ThreeTenABP:如何使用自定义日期格式/ DateTimeFormatter验证日期?
我使用ThreeTenABP似乎已经遇到了LocalDate.parse(String)和LocalDate.parse(String,DateTimeFormatter)之间实现的区别。ThreeTenABP:如何使用自定义日期格式/ DateTimeFormatter验证日期?
LocalDate.parse("31/02/1985", DateTimeFormatter.ofPattern("dd/MM/yyyy"))
解析为“1985-02-28”而不引发异常。
LocalDate.parse("2015-02-31")
DateTimeParseException:文本“2015年2月31日”无法解析:无效的日期“二月31”
的documentation几乎意味着这个以“字符串必须代表有效日期”只用无格式的方法提到。
如何使用threeten bp以自定义格式验证日期,如31/02/1985?
主要区别可以通过ISO_LOCAL_DATE格式化程序在默认情况下严格来解释。其他格式化器默认为smart。你所引用的完整的句子读起来像这样:
字符串必须代表一个有效的日期和使用 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)即可。
耶! 'DateTimeParseException:文本'31/02/1985'无法解析'。当然,现在它实际上无法解析有效的日期,但这是另一个问题。谢谢。 :) – Tom
对于其他人跟我一样的这个兔子洞 - 看到这个自定义格式包含年和严格解决 - http://stackoverflow.com/questions/26393594/using-new-java-8-datetimeformatter-to-do严格日期解析 – Tom