什么';在Java中解析XML日期时间的最佳方法是什么?

什么';在Java中解析XML日期时间的最佳方法是什么?,java,xml,Java,Xml,在Java中解析XML日期时间的最佳方法是什么?法定日期时间值包括2002-10-10T12:00:00-05:00和2002-10-10T17:00:00Z 是否有一个好的开源库可以使用,或者我应该使用SimpleDataFormat或类似的工具来实现自己的开源库 我想你想从我这里得到什么。一般来说 我强烈建议您不要使用Java中内置的日期/日历类。Joda Time设计得更好,支持不变性(特别是格式化程序是不可变的和线程安全的),并且是Java7中新的日期/时间API的基础 示例代码: im

在Java中解析XML日期时间的最佳方法是什么?法定日期时间值包括2002-10-10T12:00:00-05:00和2002-10-10T17:00:00Z

是否有一个好的开源库可以使用,或者我应该使用SimpleDataFormat或类似的工具来实现自己的开源库

我想你想从我这里得到什么。一般来说 我强烈建议您不要使用Java中内置的日期/日历类。Joda Time设计得更好,支持不变性(特别是格式化程序是不可变的和线程安全的),并且是Java7中新的日期/时间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
调用。)

理想情况下,支持模式的XML处理包(或用作支持模式的内容的基础)应该为类型化内容提供访问器。我知道有一个(),但它(还)不提供对日期/时间的访问,只提供更简单的类型(数字、数组、QName等)。有一个支持javax.xml.datatype.XMLGregorianCalendar的请求


唉,没有多少人这样做。但是,如果您使用的是特定的软件包(如XOM或JDOM等),那么在他们的用户列表中询问这个问题可能不是一个坏主意。

StaxMan绝对正确。为了使用SimpleDataFormat,您需要在每个SimpleDataFormat中关闭lax解析,并迭代多个SimpleDataFormat格式,直到找到解析日期而不引发异常的格式。如果启用lax解析,则在不需要匹配的情况下很容易得到匹配,并且在格式上留下了SimpleDataFormat无法在单个表达式中处理的灵活性

XMLSchema1.0确实使用了ISO8601,正如JonSkeet所建议的那样,JodaTime实现了ISO8601,所以这是一个有效的选项

如果希望将其全部保存在本机Java包中,还可以结合使用来解析和创建XSD:Datetime字符串

请参阅DatatypeFactory.newXMLGregorianCalendar和XMLGregorianCalendar.toXMLFormat


有一个XmlDateTime类。只需执行XMLDateTime.stringToDate(XMLDateTime)。

还有一个,它是JDK的一部分。

在XMLBeans v2中,它将是
XMLDateTime.Factory.parse(dateTimeString)
,但这很尴尬,因为它需要一个带有开始和结束标记的元素,如
2011-10-20T15:07:14.112-07:00

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

请参见,尽管: -它将“GMT”作为默认时区 -如果有尾随的不可解析部分,它不会抱怨 -不考虑时区在错误的“GMT+xxxx”上默认为“GMT”

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

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

没有所谓的“XML日期时间”。不定义文本以外的任何数据类型

使用java.time 输入字符串恰好符合标准格式。因此无需指定格式化模式,因为java.time类在解析/生成字符串时默认使用ISO8601

Instant
第二个输入字符串以a
Z
结尾,缩写为
Zulu
,表示

该类表示时间线上的一个时刻,分辨率为

OffsetDateTime
第一个输入字符串包含UTC的偏移量,因此我们将其解析为
OffsetDateTime

String input = "2002-10-10T12:00:00-05:00" ;
OffsetDateTime odt = OffsetDateTime.parse( input );
ZoneDateTime
如果您心中有一个特定的时区,而不仅仅是UTC的偏移量,请应用该时区

大陆/地区
的格式使用。切勿使用非真实时区、非标准化、甚至非唯一的3-4个字母缩写(!)

关于java.time 该框架内置于Java8及更高版本中。这些类取代了旧的麻烦的日期时间类,如
java.util.date
.Calendar
,&
java.text.SimpleDateFormat

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释

大部分java.time功能都在中向后移植到java 6和7,并进一步适应于中


该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如
Interval
YearWeek
YearQuarter
,等等。

我发现这是一种最简单的方法,无需添加到其他库中。谢谢这很好,但它允许不带时间戳的“dateTime”值和带时间戳的“dateTimeStamp”值。有什么方法需要其中一种吗?一旦升级到java 11,就停止开箱即用,因为包javax.xml.bind已在11中从JDK/JRE中删除。这非常有用!为了保持原始的时区偏移量,我使用了DateTimeFormatter
XML\u DATE\u TIME\u FORMAT=ISODateTimeFormat.dateTimeNoMillis().withOffsetParsed()
在哪里可以找到
javax.XML.datatype.DatatypeFactory的实现?我唯一能找到的是xerces2。。。我以为xerces2已经过时了。。。(过一段时间我会回到Java)你不需要找到一个——使用,你的JVM会搜索一个安装了Java的。对——一旦我弄明白了,我应该删除我的问题。
String input = "2002-10-10T17:00:00Z":
Instant instant = Instant.parse( input );
String input = "2002-10-10T12:00:00-05:00" ;
OffsetDateTime odt = OffsetDateTime.parse( input );
ZoneId zoneId = ZoneId.of( "America/Cancun" );
ZonedDateTime zdt = odt.atZone( zoneId );