Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java日期解析时区导致解析错误_Java_Date_String Formatting - Fatal编程技术网

Java日期解析时区导致解析错误

Java日期解析时区导致解析错误,java,date,string-formatting,Java,Date,String Formatting,我收到带有以下代码的ParseException,似乎无法修复它: String date = "Tue Mar 13 2012 10:48:05 GMT-0400"; SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss zzzX"); //Tried zzzZ at the end as well System.out.println(format.parse(date)); 如果我去掉simple

我收到带有以下代码的ParseException,似乎无法修复它:

String date = "Tue Mar 13 2012 10:48:05 GMT-0400";
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss zzzX"); //Tried zzzZ at the end as well
System.out.println(format.parse(date));
如果我去掉simpleDataFormat末尾的-0400和X(或Z),一切正常,但一旦它出现在代码中,它就不起作用了。我应该用什么符号来代替?我正在使用Java7

以下是我收到的解析错误:

java.text.ParseException: Unparseable date: "Tue Mar 13 2012 10:48:05 GMT-0400"
at java.text.DateFormat.parse(DateFormat.java:357)
java.text.ParseException: Unparseable date: "Tue Mar 13 2012 10:48:05 GMT-0400"
at java.text.DateFormat.parse(DateFormat.java:357)
at com.throwaway.parse.DateParsing.testDate(TestDate:17)

模式
zzzz
只能解析“GMT-04:00”样式的字符串。您的示例可以使用以下模式进行分析:
EEE-MMM-dd-yyyy-HH:mm:ss-Z
使用
“EEE-MMM-dd-yyyy-HH:mm:ss-zzz”

zzz
代表
GMT
Z
代表
“RFC 822时区”
请参考


字符串的
GMT-0400
部分的
GMT
导致问题。
Z
(或java 7中的
X
)参数仅匹配
-4000
。您必须使用如下单引号转义
GMT

DateFormat format = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss 'GMT'Z", Locale.US);

请注意,将
Local
放在日期格式中也是一个很好的做法。如果没有它,您的代码将无法在其他国家工作(如法国……。

如果您总是希望您的时区以这种方式表示,您可以在格式字符串中的单引号中添加“GMT”,以防止对其进行解析:

EEE MMM dd yyyy HH:mm:ss 'GMT'XX

不过,没有一种内置格式可以解析它,这有点奇怪。当Javadoc将
GMT-08:00
列为
z

三个问题都涉及混合使用时,可能是不正确的。要么:

  • 使用单个小写字母“z”和a:“在使用“GMT(+/-)hh:mm”时在时区中分隔小时和时间”,或
  • 使用单个大写字母“Z”并从时区中删除“GMT”,您可以使用“(+/-)hhmm”格式,或
  • 使用单个大写字母“X”并仍然删除“GMT”,但您可以使用hhmm区域的任何格式
  • 从Javadoc:

    • z一般时区太平洋标准时间;PST;GMT-08:00
    • Z RFC 822时区-0800
    • X ISO 8601时区-08-0800; -08:00

    ParseException
    我猜很遗憾,这也不行。如果我拿出-0400,去掉原始格式末尾的X或Z,日期解析就很好了。我已经试过了,我应该在问题中说得更清楚一点。如果你能在GMT和-0400之间加一个空格,你就可以解析日期了,你输入字符串的来源是什么,但我不太确定我是否总能指望时区返回GMT,有人可能会切换服务器设置,我可能会得到EST或PST或任何情况。我想你的时区格式“GMT-0400”等于常见的“-0400”,其中“GMT”是隐式的。当用小时和分钟来描述时区时,它总是以GMT作为参考。类似于“EST-0400”的东西是一种非常奇怪的表示时区的方式。另外,如果您控制字符串的生成方式,您可以更改时区格式,使其不那么模棱两可