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:
- No es necesario que solicite a sus clientes que envíen la fecha en GMT
- 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