2011-08-17 134 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 
}