2011-08-17 36 views
2

我這是在形式的日期:如何使用Java的SimpleDateFormat解析給定爲「GMT + 0100(BST)」的時區?

Wed Aug 17 2011 09:57:09 GMT+0100 (BST) 

,並有一個過濾器,需要的時間在一定的格式。問題似乎是最後的時區,我放入過濾器的格式字符串都不適用於這種類型的日期格式。

例如,

Wed Aug 17 2011 09:57:09 GMT+0100 (BST) 
EEE MMM dd yyyy HH:mm:ss zZ? 

的這個時區的一部分,一直引發錯誤。

任何人都可以告訴我什麼正確的格式來解析這些日期的時區是?

回答

6

「z」在小時和分鐘之間需要冒號。 「Z」僅爲+/- HHMM(即沒有「GMT」前綴)。

解析它的一種方法是:EEE MMM dd yyyy HH:mm:ss 'GMT'Z。 「BST」位被忽略,並且它基於偏移前始終存在「GMT」的假設。

+0

康拉德,謝謝,我試了一下格式EEE MMM DD YYYY HH:MM:SS「GMT」 Z和這似乎仍然沒有工作。你能詳細說明'z'在小時和分鐘之間需要冒號嗎? – user898465 2011-08-17 11:45:37

1

我會解析出來並單獨解釋時區信息,然後用它在適當的時區構造日期/日曆對象。

下面的代碼似乎工作不夠好你的榜樣:

String source = "Wed Aug 17 2011 09:57:09 GMT+0100 (BST)"; 
String tzid = "GMT" + source.substring(28, 31) 
    + ":" + source.substring(31, 33); 
TimeZone tz = TimeZone.getTimeZone(tzid); 
// if (tz == null) ? 
SimpleDateFormat f = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss"); 
f.setTimeZone(tz); 
Date date = f.parse(source); 
TimeZone.setDefault(TimeZone.getTimeZone("UTC")); 
System.out.println(date); 

打印"Wed Aug 17 08:57:09 UTC 2011"

更復雜的方法是使用正則表達式提取時區偏移的各個部分(「+/-」,「hh」和「mm」)。

或者,您也可以嘗試辨別3個字母時區ID(在()之間的字符串),並使用相應的Java TimeZone如果它存在。

在你的具體例子中,"BST"解析爲孟加拉國時間,即格林威治標準時間+0600,所以你最好用數字偏移量。 "BST"這裏應該是英國夏令時(GMT + 0100)。這可能很重要,因爲數字偏移量不表示使用夏令時,可根據日期生效。

更具啓發性的例程可能會考慮到這一點,並嘗試首先解析名稱,但驗證GMT偏移是否匹配,否則返回簡單的"GMT+hh:mm"時區。

-2

如果你不能找到匹配你的使用情況的模式,嘗試:爲提示答案

try{ 
    new Date("Wed Aug 17 2011 09:57:09 GMT+0100 (BST)") 
}catch(Exception e) 
{ 
    // Parse exception 
} 
相關問題