2016-07-13 30 views
3

以下測試失敗:'86生日的格式爲2068。我怎樣才能格式化爲1986如何強制java.time.LocalDate假定19世紀爲YY年份模式?

@Test 
    public void testBirthday() { 
     assertEquals("1986-08-07", java.time.LocalDate.parse("070886", 
      java.time.format.DateTimeFormatter.ofPattern("ddMMyy"))); 
    } 

與失敗:

java.lang.AssertionError: expected:<1986-08-07> but was:<2086-08-07> 

這是非常不同的,以org.joda.time庫,將正確的假設19'這裏。

/旁註:關於「重複」問題中的明顯答案,我不認爲這是重複的!

+1

的滑稽的答案是使用'org.joda.time'。 – Bathsheba

+2

不,它不是。 「喬達」實際上是「棄用」,不再發展。至少作者自己建議現在切換到java8'java.time'。 – membersound

+1

只需要注意,這是記錄的行爲:「如果字母數爲2,則使用縮小的兩位數形式。對於打印,這將輸出最右邊的兩位數。對於解析,這將使用基數值2000年,導致在2000年至2099年範圍內的一年。「不幸的是,它沒有說如何改變那種行爲。您可能可以指定一個單獨的ResolverField,但它感覺有點做作。您可能會發現,只需手動「修復」字符串即可使用四位數年份。 –

回答

3

基準年可以使用DateTimeFormatterBuilder.appendValueReduced()來控制。

該代碼將與1900年而不是2000爲基準日期解析:

DateTimeFormatter f = new DateTimeFormatterBuilder() 
    .appendPattern("ddMM") 
    .appendValueReduced(ChronoField.YEAR, 2, 2, 1900) 
    .toFormatter(); 
LocalDate date = LocalDate.parse("070886") 
-1

Java 8的LocalDate類默認使用2000年以上的年份。爲了解析1900年以後的yy格式,您需要自己縮短時間。

當然,即使您檢查日期與當前年份並且如果在今天之後減去100年,此修補程序也不適用於100歲以上的人。

您也可以使用yyyy格式。或者只是使用Date對象,並根據需要將其轉換爲LocalDate

相關問題