2012-01-30 77 views
0

我在構建DateTime(或LocalDate)時遇到了問題。我將舊代碼轉換爲內部使用joda以使事情更加理智。不過我跑入1900問題...JodaTime從Java.util.Date轉換爲DateTime(或LocalDate)

這傳遞:

assertEquals(2082, new Date(2082, 1, 1).getYear()); 

這些都失敗:

assertEquals(2083, new LocalDate(new Date(2083, 1, 1)).getYear()); 
assertEquals(2084, new DateTime(new Date(2084, 1, 1)).toLocalDateTime().getYear()); 

這是怎麼回事?如何從Date對象獲取DateTime?

+0

你會得到什麼結果? – Alexandre 2012-01-30 19:22:00

+0

我得到3983(這是2083 + 1900)和3984(這是2084 + 1900) – 2012-01-30 19:33:06

回答

5

從Javadoc文檔java.util.Date(int year, int month, int date)

已過時。從JDK版本1.1開始,由Calendar.set(年份+ 1900,月份,日期)或GregorianCalendar(年份+ 1900,月份,日期)取代。

分配Date對象並進行初始化,使其在 年,月,日參數指定的日期開始時代表 午夜本地時間。

參數:年份減去1900.月份在0-11之間。 在1-31之間的月份日期。

除了說明年份參數是從1900年開始的偏移量之外,您不應該使用此構造函數,因爲它已被棄用。相反,使用java.util.Calendar

Calendar cal = Calendar.getInstance(); 
cal.set(2083, 1, 1); 
assertEquals(2083, new LocalDate(cal).getYear()); 
3

你的代碼沒問題。

由於構造函數Date及其getYear()方法適用於1900年的年份,因此您會得到令人困惑的結果,這就是爲什麼它們已被棄用。

另請注意,從DateLocalDate/LocalDateTime的轉換需要一個時區,如果沒有明確給出,則使用默認的時區。

+0

不應該DateTime照顧這對我嗎?或者我需要構建與-1900內置的日期對象? '新日期(2082-1​​900,1,1)' – 2012-01-30 19:59:27

+0

@DavidM.Coe:它怎麼樣在意? 「Date」代表一個確切的實例,JodaTime不能改變它。是的,當你使用'Date'API時,你需要關心它的怪癖。 – axtavt 2012-01-30 20:06:15

+0

您可以想象DateTime(日期日期)的實現將創建DateTime對象從年減去-1900的情況。我會喜歡:( – 2012-01-30 21:23:39

1

一對夫婦的想法:

Date date= new Date(2083, 1, 1); 

    DateTime dt = new DateTime(2083, 1, 1, 0, 0, 0, 0); 

    assertEquals(2083, new LocalDate(dt).getYear()); 

    assertEquals(3983, new LocalDate(date).getYear()); 

確定。簡短介紹:LocalDate是一個不可變的日期時間類,代表沒有時區的日期。 (比較API,http://joda-time.sourceforge.net/apidocs/org/joda/time/LocalDate.html) LocalDate上的計算使用Chronology進行。這個年表將在內部設置爲所有計算的UTC時區。 如果您查看DateTime對象(除了事實基本相同),它將根據時區計算其字段。計算使用與現代公曆日曆兼容的默認年表(ISOChronology)完成。

您的問題:java.util.Date構造函數使用年,月,日,年爲整數y - 1900. 在您的示例中,2083代表年份3983(!)(http://docs.oracle.com/ JavaSE的/ 7 /文檔/ API/JAVA/util的/ Date.html)。 就是這樣......你錯過了-1900 ..是的,java.util。日期有1900問題;)

-Markus

相關問題