Java SimpleDateFormat ("yyyy-MM-dd'T'HH: mm: ss'Z '") fornisce il fuso orario come IST


148

Ho costruttore SimpleDateFormat come

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

e sto analizzando la stringa "2013-09-29T18:46:19Z".

Ho letto che qui Z rappresenta il GMT/UTCfuso orario. ma quando stampo questa data sulla console, stampa il fuso orario IST per la data restituita.

Ora la mia domanda è se il mio output è giusto o sbagliato?


3
sì, questo è ciò che rappresenta "Z". Z- Fuso orario
Woody

5
Z = ora Zulu => GMT + 0, ovviamente non hai servito il tuo paese;)
MushyPeas

Risposte:


251

Non hai impostato il fuso orario aggiunto solo Za alla fine della data / ora, quindi sembrerà una data / ora GMT ma questo non cambia il valore.

Imposta il fuso orario su GMT e sarà corretto.

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

3
Se hai una data, ad esempio 2012-12-06T06: 00: 00 senza la Z, rappresenta GMT?
binarygiant,

3
@binarygiant Dovresti chiedere a chi lo ha inviato. Potrebbe essere l'ora locale del mittente.
Peter Lawrey,

2
Il fuso orario può essere impostato su "UTC"
Prashanth il

2
Invece di impostare il fuso orario in così tanti posti per librerie diverse ed evitare conflitti con il fuso orario della tua macchina / laptop, dovresti sempre impostare il fuso orario predefinito della JVM impostando la proprietà di sistema user.timezone: java -Duser.timezone = GMT ...
kisna,

100

'T'e 'Z'sono considerati qui come costanti. Devi passare Zsenza virgolette. Inoltre è necessario specificare il fuso orario nella stringa di input.

Esempio: 2013-09-29T18:46:19-0700 e il formato come"yyyy-MM-dd'T'HH:mm:ssZ"


Subir, grazie per la risposta, ma cos'è "0700" aggiunto alla stringa di input ??
Pradip Borde,

-0700è il fuso orario cioè -7: 00 ore
Subir Kumar Sao

12
per -07: 00 ora e non -0700 sarebbe il seguente: yyyy-MM-dd'T'HH: mm: ss.SSSXXX
Tastybrownies

48

Da 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

se non impostato TimeZone.getTimeZone("GMT"), verrà emessoSun Sep 29 18:46:19 CST 2013

Da Java Date Object a ISO 8601 String

E per convertire l' Dateoggetto in ISO 8601 Standard ( yyyy-MM-dd'T'HH:mm:ss'Z') utilizzare il seguente codice

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

Si noti inoltre che senza ' 'yyyy-MM-dd'T'HH:mm:ssZ stampe Z.2015-01-22T03:41:02+0000


2
Mi dà java.text.ParseException: data non analizzabile: "2018-05-01T18: 30: 00.000Z" @AZ_
Mansuu ....

41

SE si desidera gestire ' standard di rappresentazione' JSON alla Data quindi meglio usare questo schema: "yyyy-MM-dd'T'HH:mm:ssX".

Si noti il Xalla fine. Gestirà i fusi orari nello standard ISO 8601 e ISO 8601 è esattamente ciò che produce questa affermazione in Javascriptnew Date().toJSON()

Rispetto ad altre risposte ha alcuni vantaggi:

  1. Non è necessario richiedere ai clienti di inviare la data in GMT
  2. Non è necessario convertire esplicitamente l'oggetto Date in GMT utilizzando questo: sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

1
Sto usando playla rilegatura automatica dei moduli e uso l' @Format.DateTimeannotazione. Utilizzare il modello predefinito con Zalla fine sembra essere errato. Dopo essere cambiato in X, funziona.
Mille

Se la tua data specifica il fuso orario in modo conforme a RFC822 come "-0500", funziona perfettamente. Ma per una data come "2013-07-15T10: 22: 17-05: 00" (anche valido ISO8601 TZ) questo si interrompe. In tal caso è necessario utilizzare "yyyy-MM-dd'T'HH: mm: ssXXX".
Lambart,

23

tl; dr

Le altre risposte sono obsolete rispetto a 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

Il formato della stringa risulta conforme alla norma ISO 8601 . Questo standard definisce formati sensibili per rappresentare vari valori di data e ora come testo.

java.time

Le vecchie java.util.Date/ .Calendare java.text.SimpleDateFormatclassi sono state soppiantate dal framework java.time incorporato in Java 8 e versioni successive. Vedi Tutorial . Evita le vecchie classi poiché si sono dimostrate mal progettate, confuse e problematiche.

Parte del design scadente nelle vecchie classi ti ha morso, in cui il toStringmetodo applica l'attuale fuso orario predefinito della JVM quando genera una rappresentazione testuale del valore data-ora che è effettivamente in UTC (GMT); ben intenzionato ma confuso.

Le classi java.time utilizzano i formati ISO 8601 per impostazione predefinita quando analizzano / generano rappresentazioni testuali di valori data-ora. Quindi non è necessario specificare un modello di analisi.

An Instantè un momento nella sequenza temporale in UTC .

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

È possibile applicare un fuso orario secondo necessità per produrre un ZonedDateTimeoggetto.

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

Tabella dei tipi di data e ora in Java, sia moderni che legacy


22

e se non hai la possibilità di andare su java8 meglio usare 'yyyy-MM-dd'T'HH: mm: ssX XX ' poiché questo viene analizzato di nuovo correttamente (mentre con una sola X questo potrebbe non essere il caso. .. a seconda della funzione di analisi)

X genera: +01

XXX genera: +01: 00


0

Per Java 8: puoi usare integrato java.time.format.DateTimeFormatterper ridurre ogni possibilità di errori di battitura, come

DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;

ISO_ZONED_DATE_TIME rappresenta 2011-12-03T10:15:30+01:00[Europe/Paris]è uno dei formati bundle DateTime standard forniti dal collegamento Oracle

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.