¿Cuál es la mejor manera de analizar XML dateTime en Java?

¿Cuál es la mejor manera de analizar XML dateTime en Java? Fecha legal Los valores de tiempo incluyen 2002-10-10T12: 00: 00-05: 00 Y 2002-10-10T17: 00: 00Z

¿Existe una buena biblioteca de código abierto que pueda usar, o debería usar mi propio uso de SimpleDateFormat o similar?

También hay javax.xml.bind.DatatypeConverter # parseDateTime (String xsdDateTime) , que viene como parte del JDK.

Creo que quieres ISODateTimeFormat.dateTimeNoMillis() de Joda Time . En general, le recomiendo encarecidamente que se mantenga alejado de las clases integradas de Fecha / Calendario en Java. Joda Time está mucho mejor diseñado, favorece la inmutabilidad (en particular, los formateadores son inmutables y libres de subprocesos) y es la base de la nueva API de fecha / hora en Java 7.

Código de muestra:

 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)); } } 

Salida:

 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 

(Tenga en cuenta que en el resultado ambos terminan como la misma hora UTC. La salida formateada utiliza UTC porque se lo solicitamos con la llamada withZone ).

StaxMan es absolutamente correcto. Para utilizar SimpleDateFormat, debe desactivar el análisis Lax en cada SimpleDateFormat e iterar en varios formatos SimpleDateFormat hasta que encuentre el que analiza la fecha sin lanzar una excepción. Si deja el análisis lax, es propenso a obtener una coincidencia cuando realmente no la quería, y el espacio léxico de XSD: DateTime deja cierta flexibilidad en el formato que SimpleDateFormat no puede manejar en una sola expresión.

XML Schema 1.0 efectivamente usa ISO 8601, que Joda Time, como lo sugiere Jon Skeet, implementa, por lo que es una opción válida.

Si desea mantenerlo todo en los paquetes nativos de Java, también puede usar XMLGregorianCalendar junto con DatatypeFactory para analizar y crear XSD: cadenas de fecha y hora.

Ver DatatypeFactory.newXMLGregorianCalendar y XMLGregorianCalendar.toXMLFormat

Consulte Parse y formatee los valores de dateTime , aunque: -Toma “GMT” como la zona horaria predeterminada -no se queja si hay partes finales no analizables -no tiene en cuenta que TimeZone se establece de manera predeterminada en “GMT” en el error “GMT + xxxx ”

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

Hay clase XmlDateTime. Solo haga XMLDateTime.stringToDate (xmlDateTime).

En XML Beans v2 sería XmlDateTime.Factory.parse(dateTimeString) , pero esto es incómodo porque espera un elemento con tags de inicio y final como 2011-10-20T15:07:14.112-07:00

Un enfoque más fácil es llamar (new org.apache.xmlbeans.GDate(dateTimeString)).getDate() .

tl; dr

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

Detalles

Las otras respuestas son correctas pero ahora están desactualizadas. Usan clases antiguas problemáticas ahora suplantadas por el framework java.time.

No existe tal cosa como “XML dateTime”. XML no define ningún tipo de datos más allá del texto.

Usando java.time

La cadena de entrada cumple con el formato estándar ISO 8601 . Por lo tanto, no es necesario especificar un patrón de formato, ya que las clases java.time usan ISO 8601 de forma predeterminada al analizar / generar cadenas.

Instant

La segunda cadena de entrada termina en una Z , abreviatura de Zulu , y significa UTC .

La clase Instant representa un momento en la línea de tiempo en UTC con una resolución de nanosegundos .

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

OffsetDateTime

La primera cadena de entrada incluye un desplazamiento desde UTC, por lo que se analiza como OffsetDateTime .

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

ZonedDateTime

Si tiene una zona horaria específica en mente, en lugar de una mera compensación de UTC, aplique eso.

Use un nombre de zona horaria apropiado en formato de continent/region . Nunca use las abreviaturas de 3-4 letras que no son verdaderas zonas horarias, no estandarizadas, y ni siquiera únicas (!).

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

Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las antiguas clases problemáticas de fecha y hora, como java.util.Date , .Calendar y java.text.SimpleDateFormat .

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a java.time.

Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones.

Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport y se adapta aún más a Android en ThreeTenABP .

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter y más.

Idealmente, los paquetes de procesamiento XML que son conscientes del esquema (o que se utilizarán como base para las cosas que son) deberían proporcionar acceso para el contenido escrito. Conozco uno ( http://woodstox.codehaus.org/ ), pero no ofrece (todavía) acceso a fecha / hora, solo tipos más simples (numéricos, matrices, QNames, etc.). Hay una solicitud para admitir javax.xml.datatype.XMLGregorianCalendar.

Por desgracia, no muchos lo hacen. Sin embargo, si está utilizando un paquete específico (como XOM o JDOM, etc.), puede que no sea una mala idea hacer esta pregunta en su lista de usuarios.

También puede usar newXMLGregorianCalendar en javax.xml.datatype.DatatypeFactory , que le proporciona un control detallado, que incluye la detección de si la zona horaria fue especificada o no.

Hola, sé que es un poco tarde, pero las personas que buscan el análisis de fecha XML en 2015, en Java 7 puedes usar el

javax.xml.datatype.DatatypeFactory

para obtener un objeto de calendario

así es como lo hice …

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