simple parse example change java date timezone date-format simpledateformat

parse - Java SimpleDateFormat("aaaa-MM-dd''T''HH: mm: ss''Z ''") da la zona horaria como IST



simpledateformat parse (6)

Las otras respuestas están pasadas de moda en Java 8.

ISO 8601

Su formato de cadena cumple con el estándar ISO 8601 . Este estándar define formatos sensibles para representar varios valores de fecha y hora como texto.

java.time

Las antiguas clases java.util.Date / .Calendar y java.text.SimpleDateFormat han sido suplantadas por el marco java.time integrado en Java 8 y posterior. Ver Tutorial . Evite las clases antiguas ya que han demostrado estar mal diseñadas, confusas y problemáticas.

Parte del diseño pobre en las clases antiguas le ha picado, donde el método toString aplica el huso horario predeterminado actual de la JVM al generar una representación de texto del valor de fecha y hora que está realmente en UTC (GMT); bienintencionado pero confuso

Las clases java.time usan formatos ISO 8601 de forma predeterminada al analizar / generar representaciones textuales de valores de fecha y hora. Entonces no es necesario especificar un patrón de análisis.

Un Instant es un momento en la línea de tiempo en UTC .

Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );

Puede aplicar un huso horario según sea necesario para producir un objeto ZonedDateTime .

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

Tengo el constructor SimpleDateFormat como

SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ss''Z''")

y estoy analizando cadenas "2013-09-29T18:46:19Z".

He leído que Z representa la zona horaria GMT/UTC . pero cuando imprimo esta fecha en la consola, imprime IST timezne para la fecha devuelta.

Ahora mi pregunta es si mi salida es correcta o incorrecta.


No ha configurado que la zona horaria solo haya agregado una Z al final de la fecha / hora, por lo que se verá como una fecha / hora GMT, pero esto no cambia el valor.

Establezca la zona horaria en GMT y será correcta.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ss''Z''"); sdf.setTimeZone(TimeZone.getTimeZone("GMT"));


SI desea manejar la representación JSON '' standard '' de la fecha, entonces es mejor utilizar este patrón: "yyyy-MM-dd''T''HH:mm:ssX" .

Observe la X al final. Manejará husos horarios en el estándar ISO 8601 , e ISO 8601 es exactamente lo que produce esta declaración en Javascript new Date().toJSON()

En comparación con otras respuestas, tiene algunos beneficios:

  1. No es necesario que solicite a sus clientes que envíen la fecha en GMT
  2. No necesita convertir explícitamente su objeto Date a GMT usando esto: sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

y si no tiene la opción de continuar con java8 mejor use ''aaaa-MM-dd''T''HH: mm: ssX XX '' ya que esto se vuelve a analizar correctamente de nuevo (mientras que con solo una X esto puede no ser el caso). .. dependiendo de su función de análisis sintáctico)

X genera: +01

XXX genera: +01: 00


''T'' y ''Z'' se consideran aquí como constantes. Necesitas pasar Z sin las comillas. Además, debe especificar la zona horaria en la cadena de entrada.

Ejemplo: 2013-09-29T18:46:19-0700 Y el formato como "yyyy-MM-dd''T''HH:mm:ssZ"


Desde ISO 8601 String a Java Date Object

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ss''Z''"); sdf.setTimeZone(TimeZone.getTimeZone("GMT")); sdf.parse("2013-09-29T18:46:19Z"); //prints-> Mon Sep 30 02:46:19 CST 2013

si no configura TimeZone.getTimeZone("GMT") , se emitirá Sun Sep 29 18:46:19 CST 2013

Desde Java Date Object a ISO 8601 String

Y para convertir el objeto Date a ISO 8601 Standard ( yyyy-MM-dd''T''HH:mm:ss''Z'' ) use el siguiente código

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ss''Z''", Locale.US); sdf.setTimeZone(TimeZone.getTimeZone("GMT")); System.out.println(sdf.format(new Date())); //-prints-> 2015-01-22T03:23:26Z

También tenga en cuenta que sin '' '' en Z yyyy-MM-dd''T''HH:mm:ssZ impresiones 2015-01-22T03:41:02+0000