我会解析出来并单独解释时区信息,然后用它在适当的时区构造日期/日历对象。
下面的代码似乎工作不够好你的榜样:
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"
时区。
康拉德,谢谢,我试了一下格式EEE MMM DD YYYY HH:MM:SS“GMT” Z和这似乎仍然没有工作。你能详细说明'z'在小时和分钟之间需要冒号吗? – user898465 2011-08-17 11:45:37