2015-09-27 149 views
1

我使用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?

+0

对于其他人跟我一样的这个兔子洞 - 看到这个自定义格式包含年和严格解决 - http://stackoverflow.com/questions/26393594/using-new-java-8-datetimeformatter-to-do严格日期解析 – Tom

回答

1

主要区别可以通过ISO_LOCAL_DATE格式化程序在默认情况下严格来解释。其他格式化器默认为smart。你所引用的完整的句子读起来像这样:

字符串必须代表一个有效的日期和使用 DateTimeFormatter.ISO_LOCAL_DATE解析。

所以这是很清楚,格式少法只能只能分析在严格模式下ISO兼容的日期,甚至再subset of ISO-8601,即:

uuuu-MM-dduuuuMMdd

关于严格模式,你可以看到它在研究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)即可。

+0

耶! 'DateTimeParseException:文本'31/02/1985'无法解析'。当然,现在它实际上无法解析有效的日期,但这是另一个问题。谢谢。 :) – Tom