关于java:将String转换为Date,差不多完成了!

Converting a String to Date, almost done!

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Converting ISO8601-compliant String to java.util.Date

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

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

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

1
2
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的问题是它期望+/-hhmm中的TimeZone和我的+/-hh:mm格式。

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

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

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

1
2
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中使用的ISO 8601标准日期和时间格式。不幸的是,Java的SimpleDateFormat不能正确支持该格式,因为它无法处理时区中的冒号。

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

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

如果您需要它作为java.util.Calendar,那么您可以在其上调用toGregorianCalendar()

1
Calendar c2 = cal.toGregorianCalendar();

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

1
Date date = c2.getTime();

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


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

用法示例:

1
2
3
4
5
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依赖:

1
2
3
4
5
<dependency>
<groupId>joda-time</groupId>
joda-time</artifactId>
<version>1.6.2</version>
</dependency>

希望能帮助到你。


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

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

版画

1
Tue Jun 07 22:08:59 BST 2011

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


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

这是一个解决方法:

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

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