tl; dr
String sql = "SELECT CURRENT_TIMESTAMP ;
…
OffsetDateTime odt = myResultSet.getObject( 1 , OffsetDateTime.class ) ;
Evita di dipendere dal sistema operativo host o dalla JVM per il fuso orario predefinito
Ti consiglio di scrivere tutto il tuo codice per indicare esplicitamente il fuso orario desiderato / previsto. Non è necessario dipendere dall'attuale fuso orario predefinito della JVM. E tieni presente che l'attuale fuso orario predefinito della JVM può cambiare in qualsiasi momento durante il runtime, con qualsiasi codice in qualsiasi thread di qualsiasi chiamata di app TimeZone.setDefault
. Tale chiamata influisce immediatamente su tutte le app all'interno di quella JVM.
java.time
Alcune delle altre risposte erano corrette, ma ora sono antiquate. Le terribili classi data-ora in bundle con le prime versioni di Java erano difettose, scritte da persone che non capivano le complessità e le sottigliezze della gestione data-ora.
Le classi data-ora precedenti sono state soppiantate dalle classi java.time definite in JSR 310.
Per rappresentare un fuso orario, utilizzare ZoneId
. Per rappresentare un offset da UTC, utilizzare ZoneOffset
. Un offset è semplicemente un numero di ore-minuti-secondi avanti o indietro rispetto al primo meridiano. Un fuso orario è molto di più. Un fuso orario è una storia delle modifiche passate, presenti e future all'offset utilizzato dalle persone di una determinata regione.
Devo forzare qualsiasi operazione relativa all'ora su GMT / UTC
Per un offset di zero ore-minuti-secondi, usa la costante ZoneOffset.UTC
.
Instant
Per catturare il momento corrente in UTC, usa un file Instant
. Questa classe rappresenta un momento in UTC, sempre in UTC per definizione.
Instant instant = Instant.now() ; // Capture current moment in UTC.
ZonedDateTime
Per vedere quello stesso momento attraverso l'ora dell'orologio da parete utilizzata dalle persone di una particolare regione, regola un fuso orario. Stesso momento, stesso punto sulla timeline, diverso tempo dell'orologio da parete.
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Banca dati
Parli di un database.
Per recuperare un momento dal database, la colonna dovrebbe essere di un tipo di dati simile allo standard SQL TIMESTAMP WITH TIME ZONE
. Recupera un oggetto anziché una stringa. In JDBC 4.2 e versioni successive, possiamo scambiare oggetti java.time con il database. Il OffsetDateTime
è richiesto da JDBC, mentre Instant
e ZonedDateTime
sono opzionali.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Nella maggior parte dei database e dei driver, immagino che otterrai il momento come visto in UTC. In caso contrario, puoi effettuare la regolazione in uno dei due modi:
- Estrai un
Instant
: odt.toInstant()
- Regola dall'offset dato a uno zero: OffsetDateTime odtUtc = odt.withOffsetSameInstant (ZoneOffset.UTC); `.
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ù, vedere il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .
Il progetto Joda-Time , ora in modalità di manutenzione , consiglia la migrazione alle classi java.time .
Puoi scambiare oggetti java.time direttamente con il tuo database. Utilizza 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?