2012-04-19 9 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; 
    } 
} 

EDIT:

私はこれらの最初の2行を更新し、それが完璧に今働いている、ありがとう!

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のデフォルトの日付を返すために"悪い(jodatimeかどうか)。代わりに 'null'を返す方が良いでしょうか? – leonbloy

+1

0001-01-01は私たちのシステムで使用されている '低い日付'ですが、私はこれを作成せず、必要なものです。 –

+1

これは、Oracleデータベースの非NULLの低い日付の場合にも非常に一般的な日付値です –