2013-10-01 52 views
73

我SimpleDateFormat的構造函數的Java的SimpleDateFormat( 「YYYY-MM-dd'T'HH:MM:ss'Z'」)給出了時區爲IST

SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") 

和我解析字符串"2013-09-29T18:46:19Z".

我已經讀過,這裏Z代表GMT/UTC時區。但是當我在控制檯上打印這個日期時,它會打印返回日期的IST時間。

現在我的問題是我的輸出是對還是錯?

+2

是的,這就是 'Z' 代表。 Z-時區 – Woody

+0

Z =祖魯時間=> GMT + 0,你顯然沒有爲你的國家服務;) – MushyPeas

回答

124

您沒有設置時區僅增加了Z到的日期/時間結束,所以它看起來像一個GMT日期/時間,但是這並未不會改變價值。

將時區設置爲GMT,它將是正確的。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
sdf.setTimeZone(TimeZone.getTimeZone("GMT")); 
+2

如果你有一個日期,比如2012-12-06T06:00:00沒有Z,那麼代表GMT? – binarygiant

+2

@binarygiant你將不得不問那些誰發送它。這可能是發件人的當地時間。 –

+2

時區可以設置爲「UTC」 – Prashanth

55

'T''Z'在這裏被認爲是常量。你需要通過Z沒有引號。此外,您需要在輸入字符串中指定時區。

例子:2013-09-29T18:46:19-0700 而且格式"yyyy-MM-dd'T'HH:mm:ssZ"

+0

Subir,謝謝你的回答,但什麼是「0700」附加到輸入字符串? –

+0

'-0700'是時區,即-7:00小時 –

+4

爲-07:00小時,而不是-0700它將如下: yyyy-MM-dd'T'HH:mm:ss.SSSXXX – Tastybrownies

23

從ISO 8601字符串到Java Date對象

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
sdf.setTimeZone(TimeZone.getTimeZone("GMT")); 
sdf.parse("2013-09-29T18:46:19Z"); //prints-> Mon Sep 30 02:46:19 CST 2013 

,如果你不設置TimeZone.getTimeZone("GMT")則輸出Sun Sep 29 18:46:19 CST 2013

從Java Date對象,以ISO 8601字符串

並將其轉換爲Date對象ISO 8601標準(yyyy-MM-dd'T'HH:mm:ss'Z')使用下面的代碼

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US); 
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));   
System.out.println(sdf.format(new Date())); //-prints-> 2015-01-22T03:23:26Z 

還要注意,如果沒有' '在žyyyy-MM-dd'T'HH:mm:ssZ打印2015-01-22T03:41:02+0000

26

如果你想處理「standard」日期的JSON表示,則最好使用此模式:"yyyy-MM-dd'T'HH:mm:ssX"

最後注意到XIt will handle timezones in ISO 8601 standard,以及ISO 8601正是在Javascript new Date().toJSON()

相較於其他的答案產生這種說法有一些好處:

  1. 你並不需要要求您的客戶在GMT
  2. 發送日期您不需要明確地將日期對象轉換爲GMT使用此:sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
+0

我使用'play'的自動錶單綁定,並使用'@ Format.DateTime'註釋。在結尾處使用默認模式與'Z'似乎是不正確的。更改爲'X'後,它可以工作。非常感謝 – transang

+0

如果您的日期以符合RFC822的方式(如「-0500」)指定時區,則此工作正常。但是,對於諸如「2013-07-15T10:22:17-05:00」(也是有效的ISO8601 TZ)的日期,這會中斷。在這種情況下,您需要使用「yyyy-MM-dd'T'HH:mm:ssXXX」。 – Lambart

7

其他答案是過時的Java 8。

ISO 8601

你的字符串格式恰好符​​合ISO 8601標準。該標準定義了用於將各種日期時間值表示爲文本的合理格式。

java.time

java.util.Date/.Calendarjava.text.SimpleDateFormat類已取代通過內置到Java 8和後來的java.time框架。見Tutorial避免舊的課程,因爲他們已被證明設計不佳,令人困惑和麻煩。

在生成實際爲UTC(GMT)的日期時間值的文本表示形式時,toString方法會應用JVM的當前默認時區,這是舊類中糟糕設計的一部分已經咬傷您。善意但令人困惑。

在解析/生成日期時間值的文本表示時,java.time類默認使用ISO 8601格式。所以不需要指定解析模式。

Instant是時間軸上的時刻UTC

Instant instant = Instant.parse("2013-09-29T18:46:19Z"); 

根據需要產生ZonedDateTime對象,你可以申請一個time zone

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(zoneId); 
3

,如果你沒有去java8選擇更好的使用 'YYYY-MM-dd'T'HH:MM:SSX XX',因爲這被正確地重新分析(用時只有一個X,這可能不是根據您的分析功能

X產生的情況下...):+01

XXX產生:+01:00

相關問題