2015-05-21 31 views
3

我可以看到格林威治標準時間是'Z'常數,作爲GMT時間的指標。但是,當我解析GMT字符串時,它仍然打印當地時間。爲什麼這個日期沒有在GMT顯示?

代碼:

SimpleDateFormat outFormat = new 
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
String timeGMT = "2015-05-21T08:42:27.334Z"; 
try { 
    System.out.println("Time GMT>>>>>>"+outFormat.parse(timeGMT)); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 

OUTPUT:

Thu May 21 08:42:27 IST 2015 

預計:在您輸入

Thu May 21 08:42:27 GMT 2015 
+0

這個重複的問題解釋得很好: http://stackoverflow.com/questions/18122608/simpledateformat-parse-loses-timezone –

+0

同意。但是'Z'常數呢。它應該被格式化爲'GMT'。那麼爲什麼我們需要設置時區。 –

+0

請檢查此:http://stackoverflow.com/questions/2201925/converting-iso-8601-compliant-string-to-java-util-date –

回答

3

這裏有兩個問題。

首先是您使用錯誤的格式進行分析。您的格式告訴解析器僅將Z視爲字面字符,無意義

這意味着它會將其解析爲本地日期,因爲它不會將Z作爲時區的標記。如果你想Z被解釋爲時間段,您的格式應該有X而不是'Z'它:

String timeGMT = "2015-05-21T08:42:27.334Z"; 

    DateFormat f1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
    DateFormat f2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX"); 

    Date d1 = f1.parse(timeGMT); 
    Date d2 = f2.parse(timeGMT); 

    System.out.println(d1); 
    System.out.println(d2); 

我目前在GMT + 3,這是我從這個獲取輸出:

Thu May 21 08:42:27 IDT 2015 
Thu May 21 11:42:27 IDT 2015

正如你看到的,d2是提前3個小時,這意味着它解釋原來的時間爲北京時間。

您的其他問題是您以默認格式打印結果日期。默認的格式是在你的本地時區,所以它會像在我的本地區一樣打印它。

要改變這一點,你還必須格式輸出

DateFormat f3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); 
    f3.setTimeZone(TimeZone.getTimeZone("GMT")); 

    System.out.println(f3.format(d2)); 

這個收益率 - 對於前面的例子 - 以下內容:

2015-05-21 08:42:27 GMT
+0

一行 - '「如果你想Z被解釋爲時區,你的格式應該有X而不是'Z''。 –

0

Z不是字面不變但意味着UTC + 00:00(別名「GMT」)。請從最後的圖案符號周圍的圖案中移除apostrophs。並且使用「X」而不是「Z」作爲符號以正確解釋「Z」作爲ISO + 8601標記用於偏移UTC + 00:00。

SimpleDateFormat outFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX"); 
相關問題