在Java中将字符串转换为日期 – 时区

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

尝试

 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来解析ISO 8601格式时区 。 请参阅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"); 

您的模式有误,您应该使用以下内容:

 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′

有关更多信息,请阅读doc: SimpleDateFormat

使用此技巧解析ISO8601日期时间格式。 我承认没有尝试过毫秒级的字符串值,这可能会给你带来额外的麻烦。 这适用于Java6。

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

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

  long ts = cal.getTimeInMillis(); cal = Calendar.getInstance(); cal.setTimeInMillis(ts); 

您应该使用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"); 

看看这个文档的例子。

问题是-07:00不是有效的时区。 时区应具有此格式 ,例如-0800