2012-04-19 75 views
3

如果此函數傳遞無效日期並引發IllegalFieldValueExcption我想返回默認日期0001-01-01。但是當下面的代碼運行時,在defaultDate中創建的日期是0001-01-02,這是錯誤的。有沒有人看到我做錯了什麼?解析日期01-01-0001與jodatime

public Date unmarshal(String string) {  
    DateTimeFormatter fmt = new DateTimeFormatter(null, DateTimeFormat.forPattern("yyyy-MM-dd").getParser()); 
    Date defaultDate = DateTime.parse("0001-01-01", fmt).toDate(); 

    try { 
     return formatter.parseDateTime(string).toDate(); 
    } 
    catch (IllegalFieldValueException e) { 
     return defaultDate; 
    } 
} 

編輯:

我的前兩行與這些更新,它現在的工作完美,謝謝!

Chronology chrono = GJChronology.getInstance(); 
Date defaultDate = new DateTime(0001, 01, 01, 10, 0, 0, 0, chrono).toDate(); 

回答

4

你的問題是因爲默認chronology在喬達時間是ISO。這個日曆系統與當今世界大多數商家所使用的日曆系統相同。 ISO系統不適用於1583年以前的歷史工作,因爲它適用了從今天開始的閏年規則(這是一個預防性日曆)。

所以你不應該在1583年之前使用defaultDate與ISO年表。如果您需要使用此類日期,則必須在Joda-Time中使用不同的年表。

+0

+1。 「返回默認日期0001-01-01」味道不好(不管是不是)。或許更好地返回'null'呢? – leonbloy 2012-04-19 13:52:51

+1

0001-01-01是我們系統使用的'低日期',我沒有創建它,它只是它需要的。 – 2012-04-19 13:57:54

+1

這也是Oracle數據庫中非空日期較低的日期值 – 2012-04-19 13:59:12