【问题标题】:How can I use Java's SimpleDateFormat to parse a timezone given as "GMT+0100 (BST)"?如何使用 Java 的 SimpleDateFormat 解析给出为“GMT+0100 (BST)”的时区?
【发布时间】:2011-08-17 10:57:50
【问题描述】:

我的日期格式为:

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?

这里的时区部分,一直报错。

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

【问题讨论】:

    标签: java parsing simpledateformat date-parsing


    【解决方案1】:

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

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

    【讨论】:

    • 康拉德,感谢您的及时回答,我尝试了 EEE MMM dd yyyy HH:mm:ss 'GMT'Z 格式,但这似乎仍然不起作用。您能否详细说明一下“z”在小时和分钟之间需要一个冒号是什么意思?
    • 你说它不起作用是什么意思? new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss 'GMT'Z").parse("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)”被硬编码的问题。谢谢
    • 您真的需要 (BST) 格式字符串吗?在我看来,这种无关紧要的东西被忽略了。
    【解决方案2】:

    我会分别解析和解释时区信息,然后使用它在适当的时区构造 Date/Calendar 对象。

    以下代码似乎与您的示例配合得很好:

    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" 时区。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-08
        • 1970-01-01
        • 2011-12-18
        • 2012-04-28
        • 2012-05-22
        • 1970-01-01
        相关资源
        最近更新 更多