我有一个字符串,2013-10-07T23:59:51.205-07:00
想将其转换为 Java 日期对象。我收到解析错误。
date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").parse("2013-10-07T23:59:51.205-07:00");
尝试
date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
.parse("2013-10-07T23:59:51.205-0700");
Z 不是文字,时区没有冒号
请参阅http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html中的示例
如果正在使用 java7,则Z
可以替换为X
并且时区可以有一个冒号
Z
不应该在引号内。我认为不适Z
用于您给定的时区。在 Java 7 之前,我想没有任何格式可以解析 ISO 8601 格式的时区,中间有冒号。你应该-0700
改用。
但是,从 Java 7 开始,您可以选择使用而X
不是Z
. 有关SimpleDateFormat
. 只需使用以下格式:
// This would work from Java 7 onwards
date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX")
.parse("2013-10-07T23:59:51.205-07:00");
您的模式是错误的,您应该使用以下内容:
date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
.parse("2013-10-07T23:59:51.205-07:00");
'X' 表示 ISO 8601 格式的时区,如您String
在此处所述:'.205-07:00'
有关更多信息,请阅读文档:SimpleDateFormat
使用这个技巧来解析 ISO8601 日期时间格式。我承认没有尝试过在字符串值中使用毫秒部分,这可能会让您更加头疼。这适用于 Java6。
import javax.xml.bind.DatatypeConverter;
Calendar cal = DatatypeConverter.parseDateTime(strDatetime);
如果我记得正确的 cal 实例可能不使用系统默认时区。它初始化为原始字符串值时区。如果您希望实例使用系统时区,您可以进行此转换。
long ts = cal.getTimeInMillis();
cal = Calendar.getInstance();
cal.setTimeInMillis(ts);
您应该使用XXX
for 格式-07:00
,而不是Z
and X
。
Date sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
.parse("2013-10-07T23:59:51.205-07:00");
看看这个文档的例子。
问题是那-07:00
不是一个有效的时区。时区应该具有这种格式,例如-0800
.