2012-02-29 68 views
10

我遇到了一個奇怪的問題。下面是一個代碼片段,描述它:Joda時間的DateTime轉換爲java.util.Date奇怪問題

DateTimeZone dtz = DateTimeZone.forOffsetHours(0); 

DateTime dt = new DateTime(dtz); 

System.out.println(dt); 
System.out.println(dt.toDate()); 

輸出爲:

2012-02-29T17:24:39.055Z 
Wed Feb 29 19:24:39 EET 2012 

我位於UTC + 2,但這個動作應該創建一個java.util.Date對象這是初始化UTC時間。我錯過了什麼?

+0

+1這是一個這是個好問題,因爲java.util.Date的Javadocs顯示了一個名爲'getTimezoneOffset'的方法,儘管事實上沒有相應的setter或構造函數來接收偏移量。 – 2012-02-29 17:44:05

+0

@RayToal很奇怪,這個問題尚未得到Sun開發者的支持 – 2012-02-29 18:23:22

回答

20

Date知道關於時區的話 - 它僅表示的時間瞬間(如約達時間的Instant型)。這距Unix時代僅有數毫秒。當您撥打Date.toString()時,總是使用系統本地時區將其轉換爲可讀的文本格式。

所以沒有什麼錯在這裏 - 剛剛超過要麼java.util.DatetoString()行爲,或兩者含義的預期失敗。

(順便說一句,喜歡DateTimeZone.UTC在創建自己的。)

+0

感謝Jon!但是使用dt.toDate()。getTime()仍然是我電腦的本地時間。如何獲得與我指定的時區相關的millis的java.util.Date對象? – 2012-02-29 17:40:08

+0

@MartinAsenov:目前尚不清楚你的意思。正如我所說,java.util.Date'總是*相對於Unix時代,即UTC時間1970年1月1日午夜。 – 2012-02-29 17:42:56

+0

是的,我知道。我想我的誤解是java.util.Date與時區有關,所以我期望新的DateTime(DateTimeZone.forOffsetHours(0))toDate()生成一個Date對象,其時間距離UTC + 2小時2小時。我的意圖是以某種方式存儲用戶相關的時間,但現在我猜這根本不需要:) – 2012-02-29 18:07:35

4

你想要的行爲是這樣的:

日期jdkDate =新的SimpleDateFormat( 「YYYY-MM-DD HH:MM:SS」 ).parse(dt.toString(「yyyy-MM-dd HH:mm:ss」));

像喬恩指出的那樣,JDK日期是時區不可知的。希望這可以幫助某人。

9

要得到一個匹配Joda的DateTime首先轉換爲LocalDateTime的JDK Date

正如在其他的答案解釋,以毫秒爲單位的時間取決於時區不會改變:

DateTime local = DateTime.now() 
Date localJDK = local.toDate() 
assert localJDK.getTime() == local.toInstant().getMillis() 

DateTime differentTimeZone = DateTime.now(DateTimeZone.forID('America/Chicago')) 
Date localJDK2 = differentTimeZone.toDate() 
assert differentTimeZone.toInstant().getMillis() == localJDK2.getTime() 
assert localJDK.getTime() == localJDK2.getTime() 

轉換一個LocalDateTimeDate將改變:

Date differentTimeZoneJDK = differentTimeZone.toLocalDateTime().toDate() 
assert localJDK.getTime() != differentTimeZoneJDK.getTime()