簡體   English   中英

JodaTime從Java.util.Date轉換為DateTime(或LocalDate)

[英]JodaTime convert from Java.util.Date to DateTime (or LocalDate)

構造DateTime(或LocalDate)時遇到問題。 我正在將舊代碼轉換為內部使用joda,以使事情更加理智。 但是我遇到了+1900問題...

通過:

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?

從javadoc中獲取java.util.Date(int year, int month, int date)

不推薦使用。 從JDK 1.1版開始,由Calendar.set(year + 1900,month,date)或GregorianCalendar(year + 1900,month,date)取代。

分配一個Date對象並對其進行初始化,以便它表示由年,月和日期參數指定的一天的開始午夜,當地時間。

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

除了它聲明Years參數與1900年的偏移量這一事實外,您不應該使用此構造函數,因為它已過時。 而是使用java.util.Calendar

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

您的代碼很好。

結果令人困惑,因為Date構造函數及其getYear()方法可用於基於1900年的年份,因此不建議使用它們。

另請注意,從DateLocalDate Date / LocalDateTime Date轉換需要一個時區,並且如果未明確指定則使用默認時區。

一些想法:

    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是一個不可變的datetime類,表示沒有時區的日期。 (比較API, http://joda-time.sourceforge.net/apidocs/org/joda/time/LocalDate.html )LocalDate的計算是使用年表進行的。 對於所有計算,此年表將在內部設置為UTC時區。 如果您查看DateTime對象,除了事實,它基本上是相同的,它相對於時區計算其字段。 使用與現代格里高利歷兼容的默認年代學(ISOChronology)進行計算。

您的問題:java.util.Date構造函數使用年,月,日,年份為y-1900。在您的示例中2083代表年份3983(!)(http://docs.oracle.com/javase/7/docs /api/java/util/Date.html)。 就是這樣...您錯過了-1900 ..是的,java.util.Date有一個1900問題;)

-馬庫斯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM