Java SimpleDateFormat (“yyyy-MM-dd’T’HH: mm: ss’Z ‘”) indica il fuso orario come IST

Ho il costruttore di 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/UTC orario GMT/UTC . ma quando stampo questa data su console, stampa IST timezne per la data di ritorno.

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

Non hai impostato il fuso orario solo aggiunto una Z alla fine della data / ora, quindi sembrerà una data / ora GMT ma questo non modifica 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")); 

'T' e 'Z' sono considerati qui come costanti. Devi passare Z senza le 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"

Dalla stringa ISO 8601 all’object data 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 

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

Da object Data Java a Stringa ISO 8601

E per convertire l’object Date in Standard ISO 8601 ( yyyy-MM-dd'T'HH:mm:ss'Z' ) usa 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 ' ' Z yyyy-MM-dd'T'HH:mm:ssZ prints 2015-01-22T03:41:02+0000

Se si desidera gestire la rappresentazione JSON standard della data, è meglio usare questo modello: "yyyy-MM-dd'T'HH:mm:ssX" .

Notare la X alla fine. Gestirà i fusi orari nello standard ISO 8601 e ISO 8601 è esattamente ciò che produce questa dichiarazione in Javascript new Date().toJSON()

Confrontando con altre risposte ha alcuni vantaggi:

  1. Non è necessario richiedere ai clienti di inviare la data in GMT
  2. Non è necessario convertire esplicitamente il tuo object Date in GMT usando questo: sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

Le altre risposte sono obsolete a partire da Java 8.

ISO 8601

Il tuo formato di stringa è conforms allo standard ISO 8601 . Questo standard definisce i formati sensibili per la rappresentazione di vari valori di data e ora come testo.

java.time

Le vecchie classi java.util.Date / .Calendar e java.text.SimpleDateFormat sono state soppiantate dal framework java.time incorporato in Java 8 e versioni successive. Vedi Tutorial . Evita le vecchie classi in quanto hanno dimostrato di essere mal progettate, confuse e problematiche.

Parte del design scarso nelle vecchie classi ti ha morso, in cui il metodo toString applica il fuso orario predefinito della JVM quando genera una rappresentazione testuale del valore data-ora effettivamente in UTC (GMT); ben intenzionato ma confuso.

Le classi java.time utilizzano i formati ISO 8601 per impostazione predefinita durante l’analisi / generazione di rappresentazioni testuali di valori di data e ora. Quindi non è necessario specificare un modello di analisi.

Un Instant è un momento sulla timeline in UTC .

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

È ansible applicare un fuso orario in base alle esigenze per produrre un object ZonedDateTime .

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

e se non hai la possibilità di andare su java8 usa meglio ‘yyyy-MM-dd’T’HH: mm: ssX XX ‘ perché questo viene nuovamente analizzato 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