在java中将字符串转换为日期 - 时区

时间:2013-10-23 08:32:14

标签: java date

我有一个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");

6 个答案:

答案 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,而不是ZX

   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