Solo intento convertir " 2016-01-28T12: 08: 47.676706-05: 00 " pero obtengo una excepción. ¿Alguien puede sugerirme DateFormat como "aaaa-MM-dd HH: mm: ss.SSSZ" para analizar la cadena en Date.

0
Naveed Ahmad 28 ene. 2016 a las 20:27

2 respuestas

La mejor respuesta

Espero que el siguiente código te ayude

String dateString = "2016-01-28T12:08:47.676706-05:00";
DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS", Locale.getDefault());
format.setTimeZone(TimeZone.getTimeZone("GMT"));
Date date = format.parse(dateString);
1
David Rauca 28 ene. 2016 a las 17:40

Tl; dr

OffsetDateTime.parse( "2016-01-28T12:08:47.676706-05:00" )

Java.time

Utilice las clases modernas java.time que reemplazan a las problemáticas clases de fecha y hora heredadas.

Las clases heredadas tenían una resolución limitada a milisegundos, mientras que las clases java.time tienen una resolución mucho más fina, nanosegundos. Eso es más que suficiente para los microsegundos en su cadena de entrada.

Su entrada cumple con el formato estándar ISO 8601. Las clases java.time utilizan formatos estándar de forma predeterminada al analizar / generar cadenas. Así que no es necesario especificar un patrón de formato en absoluto.

Analizamos su entrada como OffsetDateTime ya que incluye un desplazamiento de UTC pero no una zona horaria.

OffsetDateTime odt = OffsetDateTime.parse( "2016-01-28T12:08:47.676706-05:00" ) ;

odt.toString (): 2016-01-28T12: 08: 47.676706-05: 00

Para ver ese mismo momento como valor UTC, extrae un Instant.

Instant instant = odt.toInstant() ;

instant.toString (): 2016-01-28T17: 08: 47.676706Z

O ajústelo a una zona horaria para obtener un objeto ZonedDateTime.

Especifique un nombre de zona horaria adecuada en el formato de continent/region, como America/Montreal, Africa/Casablanca, o Pacific/Auckland. Nunca use la abreviatura de 3-4 letras como EST o IST ya que son no zonas horarias verdaderas, no estandarizadas y ni siquiera únicas (!).

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

zdt.toString (): 2016-01-29T06: 08: 47.676706 + 13: 00 [Pacífico / Auckland]

Para generar cadenas en otros formatos, busque Stack Overflow para la clase DateTimeFormatter. Ya cubierto muchas veces.


Acerca de java.time

java.time marco está integrado en Java 8 y versiones posteriores. Estas clases suplantan las antiguas clases de fecha y hora antiguas, como java.util.Date, Calendar, & SimpleDateFormat.

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

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

¿Dónde obtener las clases java.time?

El ThreeTen-Extra 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 {{X0 }}, YearWeek, YearQuarter y más.

0
Basil Bourque 2 feb. 2018 a las 01:01