Java SimpleDataFormat中日期解析的错误行为

Java SimpleDataFormat中日期解析的错误行为,java,parsing,date-format,simpledateformat,Java,Parsing,Date Format,Simpledateformat,我在jar文件中有一个java类,它位于JBoss服务器中,通过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.j

我在jar文件中有一个java类,它位于JBoss服务器中,通过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);
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=
我错过了什么?我读了很多关于SimpleDateFormat行为不端的帖子。但这是我在这些帖子中找不到的东西

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

区域设置详细信息:

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);
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版本相关的问题。。。但更多的是一个
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");


如中所述,日期解析区分区域设置。我必须承认,我不知道您的字符串如何与您的
语言环境不匹配,
,但如果。。。我们知道默认的
语言环境实际上是什么:)

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

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

我本想写一篇与另一个答案相同的关于区域设置需求的文章,但后来我看到了曙光:您的日期时间字符串符合RFC1123格式。这是Java-8和更高版本内置的,因此也是Java 6和7的现代类的后端口<代码>日期时间格式。RFC_1123_DATE_TIME
始终以英语工作,与语言环境无关。以上就是你所需要的。在使用丹麦默认语言环境的计算机上进行测试。

您能解释一下为什么不指定语言环境就会出错吗?假设默认语言环境不是locale.ENGLISH,SimpleDataFormat需要其他语言的日期和月份名称(将英语名称视为错误)。嗯。。。我没有试过那件事。让我试着更新一下,@LorenzoGatti的解释是我们在不进一步调查某个特定的
区域设置
的情况下所能做到的最好的解释。我还没有上传更改并在生产服务器上进行测试。但是我从服务器上得到了区域设置信息。补充质询。