W3C XML的Java SimpleDateFormat模式带有时区

PNS*_*PNS 30 java date iso8601 simpledateformat

我试图解析W3C XML Schema日期,如下所示

"2012-05-15T07:08:09+03:00"
Run Code Online (Sandbox Code Playgroud)

它符合W3C XML Schema dateTime规范的ISO 8601版本.

在上述日期中,时区标识符是"+03:00",但SimpleDateFormat显然不存在表示它的模式.

如果时区是"+0300",那么Z(大写)将是适用的并且SimpleDateFormat模式将是

yyyy-MM-dd'T'HH:mm:ssZ
Run Code Online (Sandbox Code Playgroud)

类似地,如果时区是"GMT+03:00",那么z(小写)将是适用的并且SimpleDateFormat模式将是

yyyy-MM-dd'T'HH:mm:ssz
Run Code Online (Sandbox Code Playgroud)

('Z'顺便说一句,大写也适用).

那么,是否有一种SimpleDateFormat模式或解决方法来表示上述日期而无需预处理日期字符串?

ass*_*ias 34

如果您使用Java 7+,则此模式应该有效(X适用于ISO 8601时区):

SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
Run Code Online (Sandbox Code Playgroud)

  • 如果只使用一个`X`,你将得到一个截断的时区,例如,`2014-03-03-T16:00:00-08`.从我对http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html(和测试)的阅读中,您需要`XXX`才能获得格式正确的时区(at至少在OP所指的是什么,特别是第3.2.7.3节),例如,"yyyy-MM-dd'T'HH:mm:ssXXX"`,它给你`2014-03-03-T16:00 :00-08:00`.请注意冒号分隔的时区信息. (12认同)

Vla*_*lad 24

怎么样的:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"){ 
    public Date parse(String source,ParsePosition pos) {    
        return super.parse(source.replaceFirst(":(?=[0-9]{2}$)",""),pos);
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 变成了'yyyy-MM-dd'T'HH:mm:ss.SSSZ`,它也像毫秒的魅力一样 (2认同)

Alv*_*vin 11

嗯,日期格式看起来像XML datetime数据类型格式?如果是XML datetime数据类型格式,则可以使用javax.xml.datatype.DatatypeFactory创建XMLGregorianCalendar

DatatypeFactory
  .newInstance()
  .newXMLGregorianCalendar("2012-05-15T07:08:09+03:00");
Run Code Online (Sandbox Code Playgroud)

上面的调用返回实例,XMLGregorianCalendar你可以使用该对象转换为其他Java datetime对象GregorianCalendar.