【问题标题】:Parsing a date string using java.text.SimpleDateFormat使用 java.text.SimpleDateFormat 解析日期字符串
【发布时间】:2009-10-12 14:15:55
【问题描述】:

我有一个奇怪的问题,我需要解析一个看起来像 1997-02-14T00:00:00.0000000+05:30 的日期字符串。日期字符串的奇怪之处在于时区信息。它是+05:30,而不是通常的+0530

我已经准备好了基本格式字符串yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ,如果不是因为 TZ 信息,它会很有效。

任何人都可以提出解决此问题的方法吗?是否有某种格式字符串可以处理这种 TZ 信息?

提前致谢。

【问题讨论】:

    标签: java datetime formatting iso8601


    【解决方案1】:

    几个月前我自己研究过这个问题。如果我没记错的话,SimpleDateFormat 不够灵活,无法接受其他时区格式(我的是 +530)。我所做的是一个简单的预处理步骤 - 即在将字符串传递给 SimpleDateFormat 之前尝试删除冒号。

    【讨论】:

      【解决方案2】:

      您能否不使用正则表达式进行预处理并替换时区,例如

      String dateAndTime = ...
      String preprocessed = dateAndTime.replace("([+-])(\\d\\d):(\\d\\d)$", "$1$2$3");
      // Go on with your life 
      

      【讨论】:

        【解决方案3】:

        这是来自 XML 文件(ISO8601 格式)的日期字符串吗?不幸的是,没有(简单的)方法可以用SimpleDateFormat 解析它,这正是由于SimpleDateFormat 无法正确处理时区部分中的':'。

        查看my answer in this other question 了解如何解析 XML 日期时间字符串。

        【讨论】:

          【解决方案4】:

          当然,预处理你的字符串总是有技巧的。

          如果没有人找到更好的答案,那已经是了。您可以将其封装在一个方法中,并带有注释来解释该 hack。

          【讨论】:

            【解决方案5】:

            SimpleDateFormat 应该接受这一点。来自the doc

            对于解析,一般时区是 也接受了。

            还有这些are specified as:

            GMTOffsetTimeZone:
                         GMT Sign Hours : Minutes
            

            这看起来像你有什么?

            如果失败,则Joda DateTimeFormat 声称会这样做。无论如何,出于各种原因(更一致和更简单的 API、格式化程序/解析器的线程安全等),我都想使用 Joda。

            【讨论】:

            • 我刚刚测试过它,但它不起作用: new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z").parse("Wed, 4 Jul 2001 12: 08:56 -07:00")
            • 如果(比如说)你有 GMT-07:00 会发生什么(我很感激这不是你目前所拥有的)
            • 是的,它在将 GMT 附加到时区(“Wed, 4 Jul 2001 12:08:56 GMT-07:00”)之后工作。但考虑到问题的格式,这(在格式字符串中使用“z”而不是“Z”)仍然不是解析这些日期的可行方法。
            • 是的。同意。您可能想查看 Joda(针对此问题和其他时间/日期问题)
            【解决方案6】:

            它的边缘仍然很粗糙,但应该可以工作:

            http://pastebin.com/f7bbb0b43

            【讨论】:

              【解决方案7】:

              我认为它应该使用StringreplaceAll 方法为regular expression

              String dateAndTime = ...
              String preprocessed = dateAndTime.replaceAll("(GMT)([+-])(\\d\\d):(\\d\\d)", "$2$3$4");
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-07-21
                • 2014-04-06
                • 1970-01-01
                • 2019-02-15
                相关资源
                最近更新 更多