【发布时间】:2013-03-03 10:25:26
【问题描述】:
我在格式化以下日期/时间时遇到问题:
2013-01-10T17:04:24.3787635-02:00
现在,我知道2013-01-10 是日期(显然)。
17:04:24.3787635 可能是时间,虽然我不知道点后面的数字是什么意思。
-02:00 我假设是时区 (GMT)。
如何在 java 中解析这个? (也许使用 JodaTime)。
【问题讨论】:
我在格式化以下日期/时间时遇到问题:
2013-01-10T17:04:24.3787635-02:00
现在,我知道2013-01-10 是日期(显然)。
17:04:24.3787635 可能是时间,虽然我不知道点后面的数字是什么意思。
-02:00 我假设是时区 (GMT)。
如何在 java 中解析这个? (也许使用 JodaTime)。
【问题讨论】:
您可以使用JodaTime 来解析此日期:
String time = "2013-01-10T17:04:24.3787635-02:00";
DateTimeFormatter df = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ");
DateTime dateTime = df.parseDateTime(time);
点后的数字 (.) 是在 JodaTime's DateTimeFormat 中用 S 表示的秒数。 Z 代表时区模式。
【讨论】:
dateTime.getZone().getID() 时,它返回给我America/Sao_Paulo。我期待GMT-3。有没有办法让它返回我所期望的,或者它只是返回我应用时区作为参考的地方?
尝试使用这种模式:
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"
可以解析这种格式的日期:
2001-07-04T12:08:56.235-07:00
虽然,源字符串中的3787635 很麻烦。它看起来不像毫秒。
查看java.text.SimpleDateFormat 了解有关模式的更多详细信息。
您也可以尝试DatatypeConverter.parseDateTime,它返回一个java.util.Calendar 对象。
DatatypeConverter.parseDateTime("2013-01-10T17:04:24.3787635-02:00").getTime()
上面的语句执行没有任何错误。
【讨论】:
只有使用 javax.xml.XMLGregorianCalendar 才能正确解析此格式。您不能使用 SimpleDateFormat,因为它接受 SSS 作为毫秒数,而不是作为秒的小数部分。
String s = "2013-01-10T17:04:24.3787635-02:00";
DatatypeFactory dtf = DatatypeFactory.newInstance();
Date date = dtf.newXMLGregorianCalendar(s).toGregorianCalendar().getTime();
【讨论】:
您的时间字符串的格式是 ISO8601 格式。 JodaTime 类ISODateTimeFormat 将直接支持该格式。但是,您将失去任何超过毫秒的精度。
String time = "2013-01-10T17:04:24.3787635-02:00";
DateTime dateTime = ISODateTimeFormat.dateTime().parseDateTime(time);
【讨论】: