2015-09-04 65 views
2

解析時間,我下一個日期時間表示爲字符串:"2015-08-21T22:00:00Z"如果我嘗試用SimpleDateFormat的解析它沒有設置時區,我收到奇怪的值:爲什麼SimpleDateFormat的需要時區設置爲UTC

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") 
sdf.parse("2015-08-21T22:00:00Z") // Fri Aug 21 22:00:00 CEST 2015 

它看起來像它會忽略Z - UTC指示符。 在另一方面,當我設置GMT時間eveything按預期工作:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") 
sdf.setTimeZone(TimeZone.getTimeZone("GMT")) 
sdf.parse("2015-08-21T22:00:00Z") // Sat Aug 22 00:00:00 CEST 2015 

爲什麼它是那樣的工作?爲什麼我需要爲SimpleDateFormat設置時區,即使該字符串包含UTC指示符?

+1

@Tunaki:這實際上是答案。隨意發佈它:-)。 – sleske

回答

4

SimpleDateFormat字符串中的單引號暗示它們是字符串文字。你已經正確地逃脫了'T',但是通過包裝Z你告訴Java忽略了這個值。刪除引號,或者按照手動方式手動設置時區。

2

問題是你沒有告訴SimpleDateFormat該字符串有一個UTC指示符(你用'Z'轉義了它)。

根據SimpleDateFormat Javadoc,ISO 8601 format獲得X模式。因此下面將提供正確的輸出:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); 
sdf.parse("2015-08-21T22:00:00Z"); // Sat Aug 22 00:00:00 CEST 2015 
相關問題