SimpleDateFormat 解析带有“Z”字面量的日期

我正在尝试解析如下所示的日期:

2010-04-05T10:16:00Z

这是每个 http://www.ietf.org/rfc/rfc3339.txt 的有效日期。'Z'字面量(引号)“表示 UTC 是指定时间的首选参考点。"

如果我尝试使用SimpleDateFormat和此模式解析它:

yyyy-MM-dd'T'HH:mm:ss

它将被解析为 星期一 四月 05 17:16:00 EDT 2010


SimpleDateFormat无法使用以下模式解析字符串:

yyyy-MM-dd'T'HH:mm:ssz
yyyy-MM-dd'T'HH:mm:ssZ

我可以显式设置时区以用于获得预期的输出,但我认为这不是必需的。我错过了什么吗?是否有替代的日期解析器?SimpleDateFormat


答案 1

Java 无法正确解析 ISO 日期。

类似于McKenzie的答案。

只需在解析之前修复。Z

法典

String string = "2013-03-05T18:05:05.000Z";
String defaultTimezone = TimeZone.getDefault().getID();
Date date = (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")).parse(string.replaceAll("Z$", "+0000"));

System.out.println("string: " + string);
System.out.println("defaultTimezone: " + defaultTimezone);
System.out.println("date: " + (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")).format(date));

结果

string: 2013-03-05T18:05:05.000Z
defaultTimezone: America/New_York
date: 2013-03-05T13:05:05.000-0500

答案 2

要解析的日期采用 ISO 8601 格式。

在 Java 7 中,读取和应用时区后缀的模式应为yyyy-MM-dd'T'HH:mm:ssX