2012-02-28 362 views
1

我的程序需要將此日期表示爲java.sql.date對象,但似乎當我創建新日期(使用日曆)並將其設置爲' 9999-12-31',最後將此java.util.date對象轉換爲java.sql.date對象,該日期轉換爲'000-01-31'。Java中日期31-12-9999的問題

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} 

它從未進入if條件爲infinityDate已經因某種原因被改爲31-01 -000,儘管otherDate實際上是'31 -12-9999'。

otherDate是31-12-9999的事實告訴我,java可以表示這個日期,但由於某種原因,當我使用日曆構造它時,它會更改日期。 (otherDate來自從數據庫提取數據的jdbc語句)

此引用日期'31 -12-9999'已被某些客戶端修復,所以它不能被更改,我的程序必須能夠比較一些傳入日期值與此。 有沒有人知道爲什麼會發生這種情況,我知道http://en.wikipedia.org/wiki/Year_10,000_problem可能是9999年後的日期問題,但我應該安全一天。

編輯:正規化日期的方法只有「標準化給定日期的那一天的午夜」

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 2012-02-28 14:38:54

+0

我會建議不要使用這樣的「標記」日期。這是代表無關邏輯的脆弱方式。 – 2012-02-28 14:41:16

+0

@Rhhound正如我所指出的那樣,它不是我自己選擇的,這是我收到的一個需求規範的一部分。 – angryInsomniac 2012-02-28 14:44:33

回答

9

月份爲零索引。 12月使用11,而不是12。這就是爲什麼你在一年中滾動。

+1

好吧,修好了!謝謝 ! 但爲什麼月份會被索引0?這是非常直觀的! – angryInsomniac 2012-02-28 14:53:20

+5

不要使用11,使用Calendar.DECEMBER – mcfinnigan 2012-02-28 15:00:58

+2

這個類別中有兩個愚蠢的特徵:(a)月份是零索引,而月份的日期不是; (b)如果你輸入了一個無效的值,那麼這個類默默地展現出意外的行爲,而不是拋出一個異常。日曆只是一個稍微笨重的設計類。不要過分擔心,但不要在自己的代碼中模擬這種行爲......! – 2012-02-28 15:00:59

0

檢查持有這兩個日期對象的小時,分​​鍾,秒和毫秒。我相信他們是不同的。

如果您想比較日期(年,月,日),則只需要創建自定義Comparator並使用它。

+0

我剛剛用NormalizeDate()方法做了什麼編輯。其基本功能是從這些日期刪除所有時間相關的數據。 – angryInsomniac 2012-02-28 14:45:31

5

Calendar.MONTH是從零開始的。呼叫

calendar.set(9999, 12, 31); 

設置日期爲「31天的第13個月的9999年的」,然後將其隱式轉換爲一年10000的第一個月它會導致一個異常,如果你第一次叫做

calendar.setLenient(false); 
+0

好吧,那修好了!謝謝 ! 但爲什麼月份會被索引0?這是非常直觀的! – angryInsomniac 2012-02-28 14:53:34

+0

@angryInsomniac:我認爲它是從C庫繼承而來的:http://www.cplusplus.com/reference/clibrary/ctime/tm/ – 2012-02-28 15:09:46