2

我有一个字符串,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");
4

6 回答 6

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并且时区可以有一个冒号

于 2013-10-23T08:36:28.323 回答
4

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");
于 2013-10-23T08:37:06.943 回答
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

于 2013-10-23T08:43:21.787 回答
3

使用这个技巧来解析 ISO8601 日期时间格式。我承认没有尝试过在字符串值中使用毫秒部分,这可能会让您更加头疼。这适用于 Java6。

import javax.xml.bind.DatatypeConverter;
Calendar cal = DatatypeConverter.parseDateTime(strDatetime);

如果我记得正确的 cal 实例可能不使用系统默认时区。它初始化为原始字符串值时区。如果您希望实例使用系统时区,您可以进行此转换。

   long ts = cal.getTimeInMillis();
   cal = Calendar.getInstance();
   cal.setTimeInMillis(ts);
于 2013-10-23T08:46:02.893 回答
1

您应该使用XXXfor 格式-07:00,而不是Zand X

   Date sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
           .parse("2013-10-07T23:59:51.205-07:00");

看看这个文档的例子。

于 2013-10-23T08:44:09.623 回答
0

问题是那-07:00不是一个有效的时区。时区应该具有这种格式,例如-0800.

于 2013-10-23T08:41:31.857 回答