编辑:既然我已经检查过它很容易支持这一点,我强烈建议您使用Joda Time。它的 ISO-8601 解析器工作正常:
String dateCreate = "2013-07-01T04:37:14.771468Z";
DateTimeFormatter formatter = ISODateTimeFormat.dateTime();
DateTime parsed = formatter.parseDateTime(dateCreate);
默认情况下,它将转换为系统默认时区,但您可以通过调用 on 更改该行为DateTimeFormatter
。
Joda Time 也是一个比内置 API 更简洁的 API - 您会发现任何日期/时间代码都更易于编写和阅读。
查看您的输入数据和您的模式:
String dateCreate = "2013-07-01T04:37:14.771468Z";
DateFormat dfParse = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss'Z'");
他们根本不匹配。你需要类似的东西:
// Don't use this directly!
DateFormat dfParse = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'");
dfParse.setTimeZone(TimeZone.getTimeZone("UTC"));
或者:
// Don't use this directly!
DateFormat dfParse = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSX");
后者将应对任何 ISO-8601 时区;前者仅限于 UTC。
不幸的是,上面的结果会以错误的毫秒数结束,因为所有微秒都会变成毫秒。我不知道在 Java 中避免这种情况的方法......您可能需要先修剪字符串。例如:
// Remove the sub-millisecond part, assuming it's three digits:
int firstPartLength = "yyyy-MM-ddTHH:mm:ss.SSS".length();
String noMicros = dateCreate.substring(0, firstPartLength) +
dateCreate.substring(firstPartLength + 3);
// Now we've got text without micros, so create an appropriate pattern
DateFormat dfParse = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
Date date = dfParse.parse(noMicros);
或者,如果你知道它总是以“Z”结尾:
int firstPartLength = "yyyy-MM-ddTHH:mm:ss.SSS".length();
String noMicros = dateCreate.substring(0, firstPartLength);
DateFormat dfParse = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
dfParse.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = dfParse.parse(noMicros);
这很烦人,如果能够告诉 Java 将点之后的任何数字视为“秒的分数”,那就太好了,但我不知道使用SimpleDateFormat
. 请注意,无论如何您都无法表示亚毫秒值Date
。