2012-02-28 138 views
1

私のプログラムでは、この日付をjava.sql.dateオブジェクトとして表現する必要がありますが、新しい日付(カレンダーを使用)を作成して ' 9999-12-31 'を呼び出し、最後にこのjava.util.dateオブジェクトをjava.sql.dateオブジェクトに変換します。この日付は' 000-01-31 'のように変換されます。日付31-12-9999のJavaでの問題

Calendar calendar = Calendar.getInstance(); 
calendar.set(9999, 12, 31); 
infinityDate = new java.sql.Date(normalizeDate(calendar.getTime()).getTime()); 

私のコードはここに到達したときinfinityDateは31-12-9999 ことなく、必要があります。

if(otherDate.equals(infinityDate)) 
{// Do stuff} 

infinityDateが何らかの理由で31から01に変更されたとして、それがあれば状態に入ることはありませんたとえotherDateが実際に'31 -12-9999 'であっても、-000になります。

otherDateが31-12-9999であることから、javaがこの日付を表すことができますが、何らかの理由でそれをカレンダーを使用して構成すると、日付が変更されます。 (otherDateはデータベースからデータを取り出すjdbcステートメントから来ます)

この参照日付'31 -12-9999 'は一部のクライアントによって修正されているため、変更することはできず、私のプログラムはいくつかのこれで到着日付の値。 誰もがこれが起こっている理由を知っていますか?私はhttp://en.wikipedia.org/wiki/Year_10,000_problemが9999年以降の日付で問題になるかもしれないことを認識していますが、1日は安全です。

EDIT:ノーマライズ日付方式のみ

private static java.util.Date normalizeDate(java.util.Date date) { 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTime(date); 
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    calendar.set(Calendar.MINUTE, 0); 
    calendar.set(Calendar.SECOND, 0); 
    calendar.set(Calendar.MILLISECOND, 0); 
    date = calendar.getTime(); 

    return date; 
} 

「その日の深夜に与えられた日付を正規化」しかし、私は日付を正規化する前に、この問題が登場して、私が解決しようとする試みでそれを正規化この。

+1

normalizeDate関数の機能は何ですか? – Brigham

+0

このような「マーカー」日付を使用しないことをお勧めします。それは無関係の論理を表現する壊れやすい方法です。 –

+0

@Ramhound私が指摘したように、私の選択ではなく、これは私が受け取った要求仕様の一部です。 – angryInsomniac

答えて

9

月のインデックスはゼロです。 12ではなく、11を12月に使用してください。これが、あなたが年を重ねる理由です。

+1

それはそれを修正しました!ありがとう! しかし、なぜ月が0にインデックス付けされるのでしょうか?それは反直感的です! – angryInsomniac

+5

11を使用しないでください。Calendar.DECEMBER – mcfinnigan

+2

このクラスには、次の2つの愚かさがあります。(a)月がゼロインデックス付けされていて、 (b)無効な値を入力した場合、クラスは例外をスローするのではなく予期しない動作を静かに表示します。カレンダーはちょっとダフリーなクラスです。それを不当に心配しないでください。しかし、あなた自身のコードでこの動作をエミュレートしないでください! –

0

これらの2つの日付オブジェクトに保持されている時間、分、秒、およびミリ秒をチェックします。私は彼らが違うと信じています。

日付(年月日)を比較したい場合は、カスタムComparatorを作成して使用してください。

+0

私は、NormalizeDate()メソッドが何をしているのかという質問を編集しました。その基本機能は、これらの日付から関連するすべてのデータを削除することです。 – angryInsomniac

5

Calendar.MONTHはゼロベースです。コール

calendar.set(9999, 12, 31); 

はあなたの最初の場合には例外につながる暗黙的に年間10000の第一月に変換した後である、「9999年の13月に31日」に日付を設定します

calendar.setLenient(false); 
+0

それはそれを修正しました!ありがとう! しかし、なぜ月が0にインデックス付けされるのでしょうか?それは反直感的です! – angryInsomniac

+0

@angryInsomniac:私はそれがCライブラリから継承されたと思います:http://www.cplusplus.com/reference/clibrary/ctime/tm/ –