2012-03-14 128 views
3

我收到用下面的代碼一個ParseException,我似乎無法修復:Java的日期解析時區導致解析錯誤

String date = "Tue Mar 13 2012 10:48:05 GMT-0400"; 
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss zzzX"); //Tried zzzZ at the end as well 
System.out.println(format.parse(date)); 

如果我拿出-0400和X(或Z )在SimpleDateFormat的結尾事情工作正常,但一旦它在代碼中,它根本不起作用。我應該用什麼符號代替?我使用的Java 7

下面是分析錯誤我收到:

java.text.ParseException: Unparseable date: "Tue Mar 13 2012 10:48:05 GMT-0400" 
at java.text.DateFormat.parse(DateFormat.java:357) 
java.text.ParseException: Unparseable date: "Tue Mar 13 2012 10:48:05 GMT-0400" 
at java.text.DateFormat.parse(DateFormat.java:357) 
at com.throwaway.parse.DateParsing.testDate(TestDate:17) 
+0

最新錯誤? – Adrian 2012-03-14 14:23:12

+0

'ParseException'我猜 – jabal 2012-03-14 14:24:30

回答

2

你的字符串GMT-0400GMT部分導致了問題。
Z(或在java 7中的X)參數只匹配-4000。您必須使用單引號這樣逃脫GMT

DateFormat format = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss 'GMT'Z", Locale.US); 

注意,它也是把一個Local在你的DateFormat一個很好的做法。如果沒有它,你的代碼將無法在其他國家(例如法國這裏)運行。

+0

這有效,但我不確定我總是可以依靠GMT返回的時區,有人可能會切換服務器設置,我可以獲得EST或PST或任何可能的情況。 – Scott 2012-03-14 14:56:14

+0

我認爲你的時區格式「GMT-0400」等於其中「GMT」隱含的常見「-0400」。當使用小時和分鐘描述時區時,它總是與GMT作爲參考的差別。像「EST-0400」這樣的東西將是一種表達時區的非常奇怪的方式。另外,如果您控制生成字符串的方式,則可以更改時區格式以使其不那麼模糊 – YCI 2012-03-14 15:03:10

0

模式zzzz只能解析 「GMT-04:00」 風格的字符串。你的例子可以用這種模式解析:EEE MMM dd yyyy HH:mm:ss Z

+0

不幸的是,這也不起作用。如果我取出-0400,並在原始格式結尾處移除X或Z,則日期解析得很好。 – Scott 2012-03-14 14:27:36

0

使用"EEE MMM dd yyyy HH:mm:ss zzzZ"
zzzGMTZ'RFC 822 time zone'請參閱

Check this out

+0

我已經試過了,我應該在這個問題上更清楚一點。 – Scott 2012-03-14 14:34:56

+0

嘗試zzzXX將更新答案,如果可行 – justshams 2012-03-14 14:39:45

+0

這也沒有工作。 – Scott 2012-03-14 14:55:03

0

如果你總是希望你的時區,以表示這種方式,你可以把「GMT」在單引號中的格式字符串,以防止它被解析:

EEE MMM dd yyyy HH:mm:ss 'GMT'XX 

這是一個有點古怪的是沒有的內置的格式可以解析它。當它列出GMT-08:00作爲z的示例時,Javadoc可能不正確?

2

三個問題都涉及混合使用。或者:

  1. 使用單一小寫字母「Z」和「:」使用「GMT(+/-)HH:MM」當在該時間段中分離的小時和時間,或
  2. 使用一個大寫的「Z」並從您的時區中刪除「GMT」,並且您可以使用「(+/-)hhmm」格式,或者使用單個大寫字母「X」並仍然刪除「GMT」,但你可以使用任何格式的hhmm區域。

從的Javadoc:

  • ž一般的時區太平洋標準時間;太平洋標準時間; GMT-08:00
  • Z RFC 822時區-0800
  • X ISO 8601時區-08; -0800; -08:00