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
, Calendar
Y 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.