在Java中parsingXML dateTime的最佳方法是什么?

在Java中parsingXML dateTime的最佳方法是什么? 法定date时间值包括2002-10-10T12:00:00-05:00和2002-10-10T17:00:00Z

有一个很好的开源库,我可以使用,或者我应该使用SimpleDateFormat或类似的滚动我自己的?

另外还有javax.xml.bind.DatatypeConverter#parseDateTime(String xsdDateTime) ,它是JDK的一部分。

我想你想从乔达时间 ISODateTimeFormat.dateTimeNoMillis() 。 一般来说,我强烈build议你远离Java中内置的Date / Calendar类。 Joda Time的devise要好得多,有利于不变性(特别是格式化程序是不可变的和线程安全的),并且是Java 7中新的date/时间API的基础。

示例代码:

 import org.joda.time.*; import org.joda.time.format.*; class Test { public static void main(String[] args) { parse("2002-10-10T12:00:00-05:00"); parse("2002-10-10T17:00:00Z"); } private static final DateTimeFormatter XML_DATE_TIME_FORMAT = ISODateTimeFormat.dateTimeNoMillis(); private static final DateTimeFormatter CHECKING_FORMAT = ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC); static void parse(String text) { System.out.println("Parsing: " + text); DateTime dt = XML_DATE_TIME_FORMAT.parseDateTime(text); System.out.println("Parsed to: " + CHECKING_FORMAT.print(dt)); } } 

输出:

 Parsing: 2002-10-10T12:00:00-05:00 Parsed to: 2002-10-10T17:00:00.000Z Parsing: 2002-10-10T17:00:00Z Parsed to: 2002-10-10T17:00:00.000Z 

(请注意,输出中的UTC时间都是一样的,格式化的输出使用UTC,因为我们用withZone调用了它。)

StaxMan是绝对正确的。 为了使用SimpleDateFormat,您需要closures每个SimpleDateFormat中的松散分析,并迭代多个SimpleDateFormat格式,直到findparsingdate而不抛出exception的格式。 如果你放开了松散的parsing,当你不需要的时候,你很容易得到一个匹配,而XSD的词法空间:DateTime在SimpleDateFormat无法在单个expression式中处理的格式中留下一些灵活性。

XML Schema 1.0确实使用了ISO 8601,Jon Skeet提出了Joda Time,它是一个有效的select。

如果要将它们全部保留在本地Java包中,还可以将XMLGregorianCalendar与DatatypeFactory结合使用来parsing和创buildXSD:Datetimestring。

请参阅DatatypeFactory.newXMLGregorianCalendar和XMLGregorianCalendar.toXMLFormat

请参阅parsing和格式化dateTime值 ,虽然: – 它将“GMT”作为默认时区 – 它不会抱怨,如果有尾随不可parsing的部分 – 不考虑TimeZone默认为“GMT”错误“GMT + XXXX”

http://xmlbeans.apache.org/samples/DateTime.html

有XmlDateTime类。 只要做XMLDateTime.stringToDate(xmlDateTime)。

在XML Beans v2中,它将是XmlDateTime.Factory.parse(dateTimeString) ,但是这很尴尬,因为它需要一个元素,其开始和结束标签如<mytime>2011-10-20T15:07:14.112-07:00</mytime>

更简单的方法是调用(new org.apache.xmlbeans.GDate(dateTimeString)).getDate()

TL;博士

 Instant instant = Instant.parse( "2002-10-10T17:00:00Z" ); OffsetDateTime odt = OffsetDateTime.parse( "2002-10-10T12:00:00-05:00" ); 

细节

其他答案是正确的,但现在已经过时了。 他们使用现在被java.time框架取代的麻烦的旧类。

没有像“XML dateTime”这样的东西。 XML不会定义超出文本的任何数据types。

使用java.time

inputstring恰好符合ISO 8601标准格式。 因此,在parsing/生成string时,不需要指定格式化模式,因为java.time类默认使用ISO 8601。

Instant

第二个inputstring以Z结尾, Zulu缩写,意思是UTC 。

Instant类表示UTC时间轴上的时间,分辨率为纳秒 。

 String input = "2002-10-10T17:00:00Z": Instant instant = Instant.parse( input ); 

OffsetDateTime

第一个inputstring包含UTC的偏移量,所以我们parsing为OffsetDateTime

 String input = "2002-10-10T12:00:00-05:00" ; OffsetDateTime odt = OffsetDateTime.parse( input ); 

ZonedDateTime

如果你有一个特定的时区,而不是从UTC的偏移,应用。

continent/region格式使用适当的时区名称 。 切勿使用不是真正的时区,不规范,甚至不是唯一(!)的3-4字母缩写。

 ZoneId zoneId = ZoneId.of( "America/Cancun" ); ZonedDateTime zdt = odt.atZone( zoneId ); 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了旧的麻烦date时间类,如java.util.Date.Calendarjava.text.SimpleDateFormat

Joda-Time项目现在处于维护模式 ,build议迁移到java.time。

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。

大部分的java.timefunction在ThreeTen- Backport中被移植到Java 6&7中,并在ThreeTenABP中进一步适用于Android 。

ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如IntervalYearWeekYearQuarter等等。

理想情况下,XML架构感知的XML处理包(或作为事物的基础)应该为types化的内容提供访问器。 我知道一个( http://woodstox.codehaus.org/ ),但它还没有提供date/时间的访问,只是简单的types(数字,数组,QName等)。 有一个请求支持javax.xml.datatype.XMLGregorianCalendar。

唉,不是很多。 但是,你正在使用特定的包(如XOM或JDOM等),在用户列表中提出这个问题可能不是一个坏主意。

您还可以在javax.xml.datatype.DatatypeFactory使用newXMLGregorianCalendar ,它可以为您提供详细的控制,包括检测是否指定时区。

嘿,我知道这有点晚了,但在2015年,人们searchXMLdateparsing,在Java 7中,您可以使用

javax.xml.datatype.DatatypeFactory

获取一个Calendar对象

这是我怎么做的..

 private Calendar mPublishDate; DatatypeFactory dtf=DatatypeFactory.newInstance(); this.mPublishDate=dtf.newXMLGregorianCalendar(mPublishDate/*date time string extracted from xml*/).toGregorianCalendar();