将字符串转换为日期,差不多完成了!

可能重复:
将符合ISO8601标准的String转换为java.util.Date

我正在尝试转换此字符串:

2011-06-07T14:08:59.697-07:00 

到Java日期,到目前为止,这就是我所做的:

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S"); Date date1 = sdf.parse("2011-06-07T14:08:59.697", new java.text.ParsePosition(0)); 

几乎一切都很好,除了最重要的部分, 时区 !! SimpleDateFormat的问题在于,它期望TimeZone在+/-hhmm而我的是+/-hh:mm格式。

另外,我不知道为什么,这有效:

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SZ"); Date date1 = sdf.parse("2011-06-07T14:08:59.697 -0700", new java.text.ParsePosition(0)); 

但这不是(时区之前的空间):

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SZ"); Date date1 = sdf.parse("2011-06-07T14:08:59.697-0700", new java.text.ParsePosition(0)); 

将此日期2011-06-07T14:08:59.697-07:00转换为java日期的正确格式是什么?

谢谢你的帮助!

这看起来像ISO 8601标准的日期和时间格式,因为它在XML中使用。 不幸的是,Java的SimpleDateFormat不能正确支持该格式,因为它无法处理时区中的冒号。

但是, javax.xml包中包含可以处理此格式的类。

 String text = "2011-06-07T14:08:59.697-07:00"; XMLGregorianCalendar cal = DatatypeFactory.newInstance().newXMLGregorianCalendar(text); 

如果你需要它作为java.util.Calendar那么你可以调用它上面的toGregorianCalendar()

 Calendar c2 = cal.toGregorianCalendar(); 

当然,你可以从中得到一个java.util.Date

 Date date = c2.getTime(); 

您还可以使用流行的Joda Time库,它本身支持这种格式(并且具有比Java标准库更好的处理日期和时间的API)。

Java SimpleDateFormat在时区信息中不支持冒号。 您应该使用其他实现,例如JodaTime 。

用法示例:

 String dateString = "2011-06-07T14:08:59.697-07:00"; String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; DateTimeFormatter dtf = DateTimeFormat.forPattern(pattern); DateTime dateTime = dtf.parseDateTime(dateString); System.out.println(dateTime); 

如果需要maven pom.xml依赖:

  joda-time joda-time 1.6.2  

希望能帮助到你。

S的问题是它会产生三位数毫秒但不会解析三位数。

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); System.out.println(sdf.parse("2011-06-07T14:08:59.697-0700")); 

版画

 Tue Jun 07 22:08:59 BST 2011 

您似乎需要删除时区中的:

看起来DateFormat无法找到毫秒的结束和时区的开始。 正规救援!

这是一个解决方法:

  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SZ"); Date date1 = sdf.parse("2011-06-07T14:08:59.697-0700".replaceAll("(?=.{5}$)", " ")); 

正则表达式放入一个空格,这段代码执行没有错误。