Saltar al contenido

Analizar la fecha ISO8601 string hasta la fecha con la zona horaria UTC

Esta es la contestación más exacta que encomtrarás aportar, pero primero estúdiala pausadamente y valora si es compatible a tu trabajo.

Solución:

Si está utilizando Java 7 o una versión anterior, puede consultar esta publicación.

Si está utilizando Java 8, puede hacer:

    DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_DATE_TIME;
    TemporalAccessor accessor = timeFormatter.parse("2015-10-27T16:22:27.605-07:00");

    Date date = Date.from(Instant.from(accessor));
    System.out.println(date);

Actualizar

Como señaló @BasilBourque en el comentario, TemporalAccessor es una interfaz de nivel de marco de Java, y no se recomienda su uso en el código de la aplicación y es recomendable usar clases concretas en lugar de las interfaces.

Esta interfaz es una interfaz de nivel de marco que no debe usarse ampliamente en el código de la aplicación. En su lugar, las aplicaciones deben crear y pasar instancias de tipos concretos, como LocalDate. Hay muchas razones para esto, parte de las cuales es que las implementaciones de esta interfaz pueden estar en sistemas de calendario distintos a ISO. Consulte ChronoLocalDate para una discusión más completa de los problemas.

Hay algunas clases concretas disponibles para usar, como LocalDate, LocalDateTime, OffsetDateTime, ZonedDateTime y etc.

DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_DATE_TIME;

OffsetDateTime offsetDateTime = OffsetDateTime.parse("2015-10-27T16:22:27.605-07:00", timeFormatter);

Date date = Date.from(Instant.from(offsetDateTime));
System.out.println(date);

tl; dr

OffsetDateTime.parse( "2015-10-27T16:22:27.605-07:00" )
.toInstant()
.toString()

2015-10-27T23: 22: 27.605Z

Detalles

Tu pregunta no es clara y específica. Quizás estos pequeños ejemplos ayuden. Mezclar las antiguas clases java.util.Date y .Calendar con Joda-Time puede confundirte. Joda-Time completamente reemplaza esas clases en lugar de aumentos.

java.time

El moderno java.time las clases suplantan tanto las clases heredadas de fecha y hora en Java como la biblioteca Joda-Time que les proporcionó su inspiración.

OffsetDateTime

los OffsetDateTime La clase representa un momento en la línea de tiempo con un desplazamiento particular de UTC que determina la hora de su reloj de pared.

los java.time las clases utilizan los formatos estándar ISO 8601 de forma predeterminada al analizar / generar cadenas. Por tanto, no es necesario especificar un patrón de formato.

OffsetDateTime odt = OffsetDateTime.parse( "2015-10-27T16:22:27.605-07:00" ) ;

Instant

Para ajustar de la compensación de siete horas detrás de UTC a la propia UTC, debemos agregar siete horas a la hora del día y cambiar la fecha si es necesario. los OffsetDateTime la clase puede hacer este trabajo por nosotros. Especifique UTC utilizando el ZoneOffset.UTC constante.

OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC ) ;

odtUtc.toString (): 2015-10-27T23: 22: 27.605Z

Si está usando este valor UTC mucho en su código, y generalmente debería hacerlo, entonces puede encontrarlo más claro de usar Instant objetos. Un Instant es siempre en UTC por definición. Podemos extraer un Instant desde el OffsetDateTime.

Instant instant = odt.toInstant() ;

instant.toString (): 2015-10-27T23: 22: 27.605Z

Tenga en cuenta que los tres de nuestros objetos anteriores (odt, odtUtc, instant) todos representan el mismo momento simultáneo, el mismo punto en la línea de tiempo. Lo único diferente es la hora del reloj de pared.

ZonedDateTime

Por cierto, si desea ver ese mismo momento ajustado a la hora del reloj de pared que usa la gente de una determinada región, especifique una zona horaria a través de ZoneId conseguir un ZonedDateTime objeto.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

zdt.toString (): 2015-10-27T19: 22: 27.605-04: 00[America/Montreal]

Utilice clases concretas en java.time

La respuesta de always_a_rookie_to_learn es similar al enfoque anterior pero usa la interfaz TemporalAccessor. Generalmente, usar las interfaces y superclases superiores es una buena idea en Java. Pero no aquí. los java.time La documentación explica que su diseño pretende que usemos las clases inferiores más concretas en nuestras aplicaciones. Las abstracciones son para uso interno solo dentro del marco, generalmente.

En el caso específico de esta Pregunta, la clase OffsetDateTime es apropiado en lugar de TemporalAccessor.


Sobre java.time

los java.time framework está integrado en Java 8 y versiones posteriores. Estas clases suplantan las antiguas y problemáticas clases de fecha y hora heredadas, como java.util.Date, CalendarY SimpleDateFormat.

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

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

Puedes intercambiar java.time objetos directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. Sin necesidad de cuerdas, sin necesidad de java.sql.* clases.

¿Dónde obtener las clases java.time?

  • Java SE 8, Java SE 9, Java SE 10, y después
    • Incorporado.
    • Parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time está retroportada a Java 6 y 7 en ThreeTen-Backport.
  • Androide
    • Versiones posteriores de implementaciones de paquetes de Android de las clases java.time.
    • Para Android anterior (<26), el ThreeTenABP el proyecto se adapta ThreeTen-Backport (mencionado anteriormente). Ver Cómo usar ThreeTenABP….

los ThreeTen-Extra el proyecto extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter, y más.


Joda-Time

ACTUALIZACIÓN: El proyecto Joda-Time en su modo de mantenimiento, y aconseja la migración a la java.time clases. Esta sección se deja intacta para la historia.

Joda-Time tiene como valor predeterminado ISO 8601 para cadenas, tanto para el análisis como para la generación. Joda-Time tiene analizadores predeterminados integrados para ISO 8601, así que simplemente pase su string al constructor o al static parse método.

java.util.Date date = new DateTime( "2010-01-01T12:00:00+01:00Z" ).toDate();

Cuando sea posible, evite java.util.Date y .Calendar, y quédate con Joda-Time y sus clases como DateTime. Utilice .Date solo cuando lo requieran otras clases.

DateTime dateTimeUtc = new DateTime( someJavaDotUtilDotDate, DateTimeZone.UTC ); // Joda-Time can convert from java.util.Date type which has no time zone.
String output = dateTime.toString(); // Defaults to ISO 8601 format.
DateTime dateTimeUtc2 = new DateTime( output, DateTimeZone.UTC ); // Joda-Time can parse ISO 8601 strings.

Para la presentación, ajuste a la zona horaria esperada por el usuario.

DateTime dateTimeMontréal = dateTimeUtc.withZone( DateTimeZone.forID( "America/Montreal" ) );

Solución nativa en Java8

Date.from(ZonedDateTime.parse("1994-11-05T08:15:30+05:30").toInstant())

Date.from(ZonedDateTime.parse("1994-11-05T13:15:30Z").toInstant())

Te mostramos reseñas y puntuaciones

Tienes la opción de añadir valor a nuestra información aportando tu experiencia en las anotaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *