我有一个String 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");
答案 0 :(得分:4)
尝试
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
,时区可以有冒号
答案 1 :(得分:4)
Z
不应该在引号内。我不认为Z
适用于您给定的时区。在Java 7之前,我猜没有任何格式来解析ISO 8601格式的时区,其间有冒号。您应该使用-0700
代替。
但是,从Java 7开始,您可以选择使用X
而不是Z
来解析ISO 8601 format timezone。请参阅SimpleDateFormat
的javadoc。只需使用以下格式:
// 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");
答案 2 :(得分:3)
您的模式错误,您应该使用以下内容:
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
答案 3 :(得分:3)
使用此技巧解析ISO8601日期时间格式。我承认没有尝试过毫秒级的字符串值,这可能会给你带来额外的麻烦。这适用于Java6。
import javax.xml.bind.DatatypeConverter;
Calendar cal = DatatypeConverter.parseDateTime(strDatetime);
如果我记得正确的cal实例可能不使用系统默认时区。它初始化为原始字符串值时区。如果您希望实例使用系统时区,则可以执行此转换。
long ts = cal.getTimeInMillis();
cal = Calendar.getInstance();
cal.setTimeInMillis(ts);
答案 4 :(得分:1)
您应该使用XXX
格式-07:00
,而不是Z
和X
。
Date sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
.parse("2013-10-07T23:59:51.205-07:00");
查看此docs的示例。
答案 5 :(得分:0)
问题是-07:00
不是有效的时区。时区应该有format,例如-0800
。