Java SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") proporciona la zona horaria como IST
Tengo el constructor SimpleDateFormat como
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
y estoy analizando la cadena"2013-09-29T18:46:19Z".
He leído que aquí Z representa la GMT/UTC
zona horaria. pero cuando imprimo esta fecha en la consola, imprime la hora IST para la fecha de devolución.
Ahora mi pregunta es si mi resultado es correcto o incorrecto.
No ha configurado la zona horaria, solo agregó un 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"));
'T'
y 'Z'
se consideran aquí como constantes. Tienes que 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"
SI desea manejar la representación JSON ' estándar ' de la fecha, entonces es mejor usar este patrón: "yyyy-MM-dd'T'HH:mm:ssX"
.
Observe el X
final. Manejará zonas horarias en el estándar ISO 8601 , y 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 exigir a sus clientes que envíen la fecha en GMT
- No necesitas convertir explícitamente tu objeto Date a GMT usando esto:
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
tl; dr
Las otras respuestas están obsoletas a partir de Java 8.
Instant // Represent a moment in UTC.
.parse( "2013-09-29T18:46:19Z" ) // Parse text in standard ISO 8601 format where the `Z` means UTC, pronounces “Zulu”.
.atZone( // Adjust from UTC to a time zone.
ZoneId.of( "Asia/Kolkata" )
) // Returns a `ZonedDateTime` object.
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.tiempo
Las antiguas clases java.util.Date
/ .Calendar
y java.text.SimpleDateFormat
han sido reemplazadas por el marco java.time integrado en Java 8 y posteriores. Ver Tutorial . Evite las clases antiguas, ya que han demostrado estar mal diseñadas, ser confusas y problemáticas.
Te ha afectado parte del mal diseño de las clases antiguas, donde el toString
método aplica la zona horaria predeterminada actual de la JVM al generar una representación de texto del valor de fecha y hora que en realidad está en UTC (GMT); bien intencionado pero confuso.
Las clases java.time utilizan formatos ISO 8601 de forma predeterminada al analizar/generar representaciones textuales de valores de fecha y hora. Por tanto, no es necesario especificar un patrón de análisis.
An Instant
es un momento en la línea de tiempo en UTC .
Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );
Puede aplicar una zona horaria según sea necesario para producir un ZonedDateTime
objeto.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );