2014-01-24 58 views
4

我測試Joda日期時間對java.util.Date與UTC時區,我遇到了一個有趣的例子:爲什麼Joda DateTime與Java Date不同的結果?

import org.joda.time.DateTime; 

import java.text.DateFormat; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.*; 
import java.util.Date; 

public class Main { 

    public static void main(String[] args) throws ParseException { 
     String dt = "2011-06-11T12:00:00Z"; 
     String format = "yyyy-MM-dd'T'hh:mm:ss'Z'"; 

     DateFormat df = new SimpleDateFormat(format); 
     df.setTimeZone(TimeZone.getTimeZone("UTC")); 

     Date d = df.parse(dt); 
     DateTime joda = new DateTime(dt); 

     // Output Sat Jun 11 05:00:00 PDT 2011 
     System.out.println(joda.toDate()); 

     // Output Fri Jun 10 17:00:00 PDT 2011 
     System.out.println(d); 
    } 
} 

我不知道這是任何一個或我錯過了這裏的東西很重要的一個錯誤?

+0

您只將UTC時區設置爲「d」變量,即java.util.Date。爲Joda DateTime「joda」變量設置時區。 –

+0

順便說一句,您的DateTime正在獲取默認時區。如果您想要UTC/GMT(或任何特定時區),請傳遞['DateTimeZone'](http://www.joda.org/joda-time/apidocs/org/joda/time/DateTimeZone.html)對象。對於UTC/GMT,有一個[預定義常數「UTC」](http://www.joda.org/joda-time/apidocs/org/joda/time/DateTimeZone.html#UTC)。像這樣:'DateTime dateTime = new DateTime(「2011-06-11T12:00:00Z」,DateTimeZone.UTC);' –

回答

6

(編輯:更加清晰和正確答案)

我相信這是因爲JODA和Java日期格式在12小時的報告處理「12」是不同的。其中一人將其視爲午夜,而另一人將其視爲中午。

將您的輸入更改爲 2011-06-11T01:00:00Z將證明我的假設。

那是因爲,你正在使用的DateTime,這反過來分析使用ISO格式的字符串,它們使用24小時格式的構造函數創建JODA時間:Default format used by JODA,而日期格式您用於構建您的Java日期時間字段使用hh,表示12小時格式。因此,他們對「12」的解釋是不同的:12小時格式將其視爲深夜,而24小時將其視爲中午。

最簡單的變化是將格式更改爲yyyy-MM-dd'T'HH:mm:ss'Z',它們使用24小時演示文稿,然後它們都可以正常工作。

+0

有趣!非常感謝,我不知道改成大寫字母確實意味着什麼。 – Chan

+1

@Chan FYR:http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html&http://docs.oracle.com/javase/7/docs/api/java /text/SimpleDateFormat.html。 –

相關問題