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

148

Tengo el constructor SimpleDateFormat como

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

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

He leído que aquí Z representa la GMT/UTCzona horaria. 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.

Pradip Borde
fuente
3
sí, eso es lo que representa 'Z'. Z- Zona horaria
Woody
55
Z = hora zulú => GMT + 0, obviamente no
serviste a

Respuestas:

251

No ha establecido la zona horaria solo agregó un Zal 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"));
Peter Lawrey
fuente
3
Si tiene una fecha, digamos 2012-12-06T06: 00: 00 sin la Z, ¿eso representa GMT?
binarygiant
3
@binarygiant Tendrías que preguntar a quienes lo enviaron. Podría ser la hora local del remitente.
Peter Lawrey
2
La zona horaria se puede configurar en "UTC"
Prashanth
2
En lugar de configurar la zona horaria en tantos lugares para diferentes bibliotecas y evitar conflictos con la zona horaria de su máquina / computadora portátil, siempre debe establecer la zona horaria predeterminada de la JVM configurando la propiedad del sistema user.timezone: java -Duser.timezone = GMT ...
kisna
100

'T'y 'Z'se consideran aquí como constantes. Necesitas pasar Zsin 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"

Subir Kumar Sao
fuente
Subir, gracias por su respuesta, pero ¿qué es "0700" agregado a la cadena de entrada?
Pradip Borde
-0700es la zona horaria, es decir, -7: 00 horas
Subir Kumar Sao
12
para -07: 00 horas y no -0700 sería lo siguiente: aaaa-MM-dd'T'HH: mm: ss.SSSXXX
Tastybrownies
48

De la cadena ISO 8601 al objeto de fecha Java

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 lo configura TimeZone.getTimeZone("GMT"), se generaráSun Sep 29 18:46:19 CST 2013

De Java Date Object a ISO 8601 String

Y para convertir Dateobjetos al estándar ISO 8601 ( 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 impresiones ' 'en Zyyyy-MM-dd'T'HH:mm:ssZ2015-01-22T03:41:02+0000

ARIZONA_
fuente
2
Me da java.text.ParseException: fecha no analizable: "2018-05-01T18: 30: 00.000Z" @AZ_
Mansuu ....
41

SI desea manejar ' estándar de representación' JSON de la fecha a continuación, mejor utilizar este patrón: "yyyy-MM-dd'T'HH:mm:ssX".

Observe el Xal final. Manejará zonas horarias en el estándar ISO 8601 , e ISO 8601 es exactamente lo que produce esta declaración en Javascriptnew Date().toJSON()

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

  1. No necesita exigir 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"));
Mi título
fuente
1
Estoy usando playel enlace automático de formulario y uso @Format.DateTimeanotaciones. El uso del patrón predeterminado con Zal final parece ser incorrecto. Después de cambiar a X, funciona. Muchas gracias
transang
Si su fecha especifica la zona horaria de manera compatible con RFC822 como "-0500", esto funciona bien. Pero para una fecha como "2013-07-15T10: 22: 17-05: 00" (también válido ISO8601 TZ) esto se rompe. En ese caso, debe usar "aaaa-MM-dd'T'HH: mm: ssXXX".
Lambart
23

tl; dr

Las otras respuestas están pasadas de moda 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 la norma ISO 8601 . Este estándar define formatos sensibles para representar varios valores de fecha y hora como texto.

java.time

Las antiguas java.util.Date/ .Calendary las java.text.SimpleDateFormatclases han sido suplantadas por el marco java.time integrado en Java 8 y versiones posteriores. Ver tutorial . Evite las clases antiguas, ya que han demostrado ser mal diseñadas, confusas y problemáticas.

Parte del diseño deficiente en las clases antiguas lo ha mordido, donde el toStringmétodo aplica la zona horaria predeterminada actual de la JVM al generar una representación de texto del valor de fecha y hora que está realmente 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 lo tanto, no es necesario especificar un patrón de análisis.

Un Instantes 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 ZonedDateTimeobjeto.

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

Tabla de tipos de fecha y hora en Java, tanto modernos como heredados

Albahaca Bourque
fuente
22

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

X genera: +01

XXX genera: +01: 00

Tercer hombre
fuente
0

Para Java 8: puede usar incorporado java.time.format.DateTimeFormatterpara reducir cualquier posibilidad de errores tipográficos, como

DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;

ISO_ZONED_DATE_TIME representa 2011-12-03T10:15:30+01:00[Europe/Paris]es uno de los formatos estándar de fecha y hora incluidos que proporciona el enlace de Oracle

niraj
fuente