【问题标题】:Misbehaving of the date parsing in SimpleDateFormatSimpleDateFormat 中日期解析的错误行为
【发布时间】:2014-01-30 11:37:42
【问题描述】:

我在 JBoss 服务器中的 jar 文件中有一个 java 类,它通过 bash 文件调用,如下所示。

java -cp /com/site/domain/TimeFormatter.jar packOne.subPack.Test

但是我在解析下面的日期时出错了。

java.text.ParseException: Unparseable date: "Wed, 29 Jan 2014 21:00:00 GMT"
    at java.text.DateFormat.parse(DateFormat.java:335)

Java 代码:

Date date = new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss z").parse("Sun, 26 Jan 2014 21:00:00 GMT");
System.out.println("main().date : " + date);

我在这里缺少什么?我读了很多关于 SimpleDateFormat 行为不端的帖子。但这是我在这些帖子中找不到的东西。

注意:我认为这是因为 java 版本更改或某些原因。但是,我在我的机器上执行了具有不同版本的相同程序。它工作得很好。 服务器java版本“1.5.0_22”

地区详情:

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

【问题讨论】:

    标签: java parsing date-format simpledateformat


    【解决方案1】:

    对我来说很好用,我认为这不是 Java 版本 相关的问题...而更多的是Locale 问题:)

    为您的SimpleDateFormat 指定Locale.ENGLISH 应该最终使它起作用。例如,您可以这样做:

    final Date date = new SimpleDateFormat("EEE, dd MMM yyyy hh:mm:ss z", Locale.ENGLISH).parse("Sun, 26 Jan 2014 21:00:00 GMT");
    

    javadoc entry for SimpleDateFormat 中所指定,日期解析是区域设置敏感的。我不得不承认,我不完全知道您的字符串与您的 Locale, 不匹配,但我们可以进一步调查...我们知道您的默认 Locale 实际上是什么 :)

    【讨论】:

    • 你能解释一下为什么在没有指定语言环境的情况下会出错吗?
    • 假设默认语言环境不是 Locale.ENGLISH,SimpleDateFormat 需要其他语言的日期和月份名称(将英语视为错误)。
    • 嗯...我没试过那个东西。一会儿我试试更新
    • 是的,@LorenzoGatti 的解释是我们可以做到的最好的解释,而无需对某人的特定 Locale 进行进一步调查。
    • 我还没有上传更改并在生产服务器中进行了测试。但我从服务器获得了语言环境信息。在问题中添加。
    【解决方案2】:

    当第一次提出和回答这个问题时,现代 Java 日期和时间类还没有完全问世。我想贡献我现在推荐使用的现代解决方案。

        ZonedDateTime dateTime = ZonedDateTime.parse("Wed, 29 Jan 2014 21:00:00 GMT", 
                DateTimeFormatter.RFC_1123_DATE_TIME);
    

    我正准备在另一个答案中写下对语言环境的需求,但后来我看到了曙光:您的日期时间字符串符合 RFC 1123 格式。这是内置于 Java-8 及更高版本的,因此也与 ThreeTen Backport,现代类到 Java 6 和 7 的反向移植。DateTimeFormatter.RFC_1123_DATE_TIME 始终以英语工作,独立于语言环境。所以以上就是你所需要的。在具有丹麦默认语言环境的计算机上进行了测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      相关资源
      最近更新 更多