我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時間。
現在我的問題是我的輸出是對還是錯?
我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時間。
現在我的問題是我的輸出是對還是錯?
您沒有設置時區僅增加了Z
到的日期/時間結束,所以它看起來像一個GMT日期/時間,但是這並未不會改變價值。
將時區設置爲GMT,它將是正確的。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
如果你有一個日期,比如2012-12-06T06:00:00沒有Z,那麼代表GMT? – binarygiant
@binarygiant你將不得不問那些誰發送它。這可能是發件人的當地時間。 –
時區可以設置爲「UTC」 – Prashanth
'T'
和'Z'
在這裏被認爲是常量。你需要通過Z
沒有引號。此外,您需要在輸入字符串中指定時區。
例子:2013-09-29T18:46:19-0700
而且格式"yyyy-MM-dd'T'HH:mm:ssZ"
Subir,謝謝你的回答,但什麼是「0700」附加到輸入字符串? –
'-0700'是時區,即-7:00小時 –
爲-07:00小時,而不是-0700它將如下: yyyy-MM-dd'T'HH:mm:ss.SSSXXX – Tastybrownies
從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
如果你想處理「standard」日期的JSON表示,則最好使用此模式:"yyyy-MM-dd'T'HH:mm:ssX"
。
最後注意到X
。 It will handle timezones in ISO 8601 standard,以及ISO 8601正是在Javascript new Date().toJSON()
相較於其他的答案產生這種說法有一些好處:
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
其他答案是過時的Java 8。
你的字符串格式恰好符合ISO 8601標準。該標準定義了用於將各種日期時間值表示爲文本的合理格式。
老java.util.Date
/.Calendar
和java.text.SimpleDateFormat
類已取代通過內置到Java 8和後來的java.time框架。見Tutorial。 避免舊的課程,因爲他們已被證明設計不佳,令人困惑和麻煩。
在生成實際爲UTC(GMT)的日期時間值的文本表示形式時,toString
方法會應用JVM的當前默認時區,這是舊類中糟糕設計的一部分已經咬傷您。善意但令人困惑。
在解析/生成日期時間值的文本表示時,java.time類默認使用ISO 8601格式。所以不需要指定解析模式。
Instant instant = Instant.parse("2013-09-29T18:46:19Z");
根據需要產生ZonedDateTime
對象,你可以申請一個time zone。
ZoneId zoneId = ZoneId.of("America/Montreal");
ZonedDateTime zdt = instant.atZone(zoneId);
,如果你沒有去java8選擇更好的使用 'YYYY-MM-dd'T'HH:MM:SSX XX',因爲這被正確地重新分析(用時只有一個X,這可能不是根據您的分析功能
X產生的情況下...):+01
XXX產生:+01:00
是的,這就是 'Z' 代表。 Z-時區 – Woody
Z =祖魯時間=> GMT + 0,你顯然沒有爲你的國家服務;) – MushyPeas