如何使用Java';s SimpleDateFormat来解析一个时区,该时区被称为;格林尼治标准时间+;0100(英国夏令时)“;?

如何使用Java';s SimpleDateFormat来解析一个时区,该时区被称为;格林尼治标准时间+;0100(英国夏令时)“;?,java,parsing,simpledateformat,date-parsing,Java,Parsing,Simpledateformat,Date Parsing,我有一个日期,形式如下: 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? 其中的时区部分不断抛出错误 谁能告诉我在这些日期解析时区的正确格式是什么吗?“z”需要一个介于小时和分钟之间的冒

我有一个日期,形式如下:

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?
其中的时区部分不断抛出错误

谁能告诉我在这些日期解析时区的正确格式是什么吗?

“z”需要一个介于小时和分钟之间的冒号。“Z”仅为+/-HHMM(即没有“GMT”前缀)


解析它的一种方法是:
EEE MMM dd yyyy HH:mm:ss'GMT'Z
。“BST”位被忽略,它基于偏移量之前始终存在“GMT”的假设。

我将分别解析和解释时区信息,然后使用它在适当的时区中构造日期/日历对象

以下代码在您的示例中似乎工作得很好:

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);
打印“2011年8月17日星期三08:57:09 UTC”

更复杂的方法是使用正则表达式提取时区偏移量的各个部分(“+/-”、“hh”和“mm”)

或者,您可以尝试识别3个字母的时区id(介于
之间的字符串),并使用相应的Java
时区(如果存在)

但是,在您的特定示例中,
“BST”
解析为孟加拉国时间,即GMT+0600,因此您最好使用数字偏移量<代码>“英国夏令时”
此处可能应视为英国夏季时间(GMT+0100)。这可能很重要,因为数字偏移并不表示使用夏令时,夏令时的有效性取决于日期


一个更具启发性的例程可以考虑到这一点,并尝试首先解析名称,但要验证GMT偏移量是否匹配,否则就退回到简单的
“GMT+hh:mm”
时区。

如果找不到与用例匹配的模式,请尝试:

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

康拉德,谢谢你的及时回答,我尝试了EEE MMM dd yyyy HH:mm:ss'GMT'Z的格式,但似乎仍然不起作用。你能详细解释一下你所说的“z”在小时和分钟之间需要一个冒号是什么意思吗?你说它不工作是什么意思?新的SimpleDataFormat(“EEE MMM dd yyyy HH:mm:ss'GMT'Z”)。解析(“Wed Aug 17 2011 09:57:09 GMT+0100(BST)”)对我来说效果很好。我认为问题是,我正在处理的程序将这个日期“Wed Aug 17 2011 09:57:09 GMT+0100(BST)”,然后要求将其转换为具有指定模式的对象。从技术上讲,它是一个正在转换的字符串,“(BST)”部分需要在格式中计算。我发现这种格式在“EEE-MMM-dd-yyyy-HH:mm:ss”GMT'Z“(英国夏令时)”中有效。这当然给我留下了一个问题,“(BST)”被硬编码。谢谢你真的需要(BST)格式的字符串吗?在我看来,这种无关的事情似乎被忽视了。