tl; dr
Instant.now() // Capture the current moment in UTC.
Genera una stringa per rappresentare quel valore:
Instant.now().toString()
2016-09-13T23: 30: 52.123Z
Dettagli
Come affermato dalla risposta corretta di Jon Skeet , un oggetto java.util.Date non ha fuso orario † . Ma la sua toString
implementazione applica il fuso orario predefinito della JVM quando genera la rappresentazione String di quel valore data-ora. Confusamente per il programmatore ingenuo, un Date sembra avere un fuso orario ma non lo è.
I java.util.Date
, j.u.Calendar
e java.text.SimpleDateFormat
le classi Java in bundle con sono notoriamente fastidiosi. Evitali. Utilizzare invece una di queste librerie di data e ora competenti:
java.time (Java 8)
Java 8 offre un nuovo eccellente pacchetto java.time. * Per soppiantare le vecchie classi java.util.Date/Calendar.
Ottenere l'ora corrente in UTC / GMT è un semplice one-liner ...
Instant instant = Instant.now();
Quella Instant
classe è il blocco base di java.time, che rappresenta un momento sulla linea temporale in UTC con una risoluzione di nanosecondi .
In Java 8, il momento attuale viene acquisito con una risoluzione fino a millisecondi. Java 9 porta una nuova implementazione di Clock
acquisizioni del momento attuale fino alla piena capacità di nanosecondi di questa classe, a seconda della capacità dell'hardware di clock del tuo computer host.
Il suo toString
metodo genera una rappresentazione String del suo valore usando uno specifico formato ISO 8601 . Quel formato genera cifre a zero, tre, sei o nove cifre ( millisecondi , microsecondi o nanosecondi ) secondo necessità per rappresentare la frazione di secondo.
Se desideri una formattazione più flessibile o altre funzionalità aggiuntive, applica uno scostamento da UTC pari a zero, affinché UTC stesso ( ZoneOffset.UTC
costante ) ottenga un OffsetDateTime
.
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );
Dump per console ...
System.out.println( "now.toString(): " + now );
Quando eseguito ...
now.toString(): 2014-01-21T23:42:03.522Z
Informazioni su java.time
Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time come java.util.Date
, Calendar
, e SimpleDateFormat
.
Per saperne di più, consulta il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .
Il progetto Joda-Time , ora in modalità manutenzione , consiglia la migrazione alle classi java.time .
Puoi scambiare oggetti java.time direttamente con il tuo database. Utilizzare un driver JDBC conforme a JDBC 4.2 o successivo. Non c'è bisogno di stringhe, non c'è bisogno di java.sql.*
classi.
Dove ottenere le classi java.time?
Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili aggiunte future a java.time. Si possono trovare alcune classi utili, come per esempio Interval
, YearWeek
, YearQuarter
e altro .
Joda-Time
AGGIORNAMENTO: il progetto Joda-Time , ora in modalità manutenzione , consiglia la migrazione alle classi java.time .
Utilizzando la libreria gratuita open source di terze parti di Joda-Time , è possibile ottenere la data-ora corrente in una sola riga di codice.
Joda-Time ha ispirato le nuove classi java.time. * In Java 8, ma ha un'architettura diversa. È possibile utilizzare Joda-Time nelle versioni precedenti di Java. Joda-Time continua a funzionare in Java 8 e continua a essere attivamente mantenuto (dal 2014). Tuttavia, il team di Joda-Time consiglia la migrazione a java.time.
System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );
Codice di esempio più dettagliato (Joda-Time 2.3) ...
org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time zone.
org.joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );
Dump per console ...
System.out.println( "Local time in ISO 8601 format: " + now );
System.out.println( "Same moment in UTC (Zulu): " + zulu );
Quando eseguito ...
Local time in ISO 8601 format: 2014-01-21T15:34:29.933-08:00
Same moment in UTC (Zulu): 2014-01-21T23:34:29.933Z
Per ulteriori esempi di codice che funzionano con il fuso orario, vedere la mia risposta a una domanda simile.
Fuso orario
Ti consiglio di specificare sempre un fuso orario piuttosto che fare affidamento implicito sul fuso orario predefinito corrente della JVM (che può cambiare in qualsiasi momento!). Tale dipendenza sembra essere una causa comune di confusione e bug nel lavoro di data e ora.
Quando si chiama, now()
passare il fuso orario desiderato / previsto da assegnare. Usa la DateTimeZone
classe.
DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );
Quella classe contiene una costante per il fuso orario UTC .
DateTime now = DateTime.now( DateTimeZone.UTC );
Se si desidera veramente utilizzare l'attuale fuso orario predefinito della JVM, effettuare una chiamata esplicita in modo che il codice sia autocompattante.
DateTimeZone zoneDefault = DateTimeZone.getDefault();
ISO 8601
Leggi i formati ISO 8601 . Sia java.time che Joda-Time usano i formati sensibili di quello standard come valori predefiniti sia per l'analisi che per la generazione di stringhe.
† In realtà, java.util.Date ha un fuso orario, sepolta sotto strati di codice sorgente. Ai fini più pratici, quel fuso orario viene ignorato. Quindi, come abbreviazione, diciamo che java.util.Date non ha fuso orario. Inoltre, quel fuso orario sepolto non è quello usato dal toString
metodo Date ; quel metodo usa l'attuale fuso orario predefinito della JVM. Un motivo in più per evitare questa classe confusa e rimanere con Joda-Time e java.time.