2

我有一个日期形式为:

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?

时区部分,不断抛出错误。

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

4

3 回答 3

6

“z”在小时和分钟之间需要一个冒号。“Z”只是+/-HHMM(即没有“GMT”前缀)。

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

于 2011-08-17T11:04:56.263 回答
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"解析为 GMT+0600 的孟加拉国时间,因此您最好使用数字偏移量。"BST"这里可能应该被视为英国夏令时间 (GMT+0100)。这可能很重要,因为数字偏移量并不表示使用夏令时,这可能取决于日期。

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

于 2011-08-17T13:37:03.590 回答
-2

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

try{
    new Date("Wed Aug 17 2011 09:57:09 GMT+0100 (BST)")
}catch(Exception e)
{
  // Parse exception
}
于 2013-05-30T09:49:09.577 回答