2015-09-27 74 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