在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
, .Calendar
和java.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一些有用的类,比如Interval
, YearWeek
, YearQuarter
等等。
理想情况下,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();