tl; dr
Usa solo le moderne classi java.time . Non usare mai le classi precedenti terribili, come SimpleDateFormat
, Date
o java.sql.Timestamp
.
ZonedDateTime // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now( // Capture the current moment.
ZoneId.of( "Africa/Tunis" ) // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST.
) // Returns a `ZonedDateTime` object.
.format( // Generate a `String` object containing text representing the value of our date-time object.
DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
) // Returns a `String`.
Oppure utilizza il fuso orario predefinito corrente della JVM .
ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )
java.time e JDBC 4.2
L'approccio moderno utilizza le classi java.time come visto sopra.
Se il driver JDBC è conforme a JDBC 4.2 , è possibile scambiare direttamente oggetti java.time con il database. Usa PreparedStatement::setObject
e ResultSet::getObject
.
Utilizzare java.sql solo per i driver precedenti a JDBC 4.2
Se il driver JDBC non è ancora conforme a JDBC 4.2 per il supporto dei tipi java.time , è necessario ricorrere all'utilizzo delle classi java.sql.
Memorizzazione dei dati.
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ; // Capture the current moment in UTC.
myPreparedStatement.setObject( … , odt ) ;
Recupero dati.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
I tipi java.sql, come ad esempio java.sql.Timestamp
, devono essere utilizzati solo per il trasferimento all'interno e all'esterno del database. Converti immediatamente in tipi java.time in Java 8 e versioni successive.
java.time.Instant
Una java.sql.Timestamp
mappa a java.time.Instant
, un momento sulla linea temporale in UTC. Nota il nuovo metodo di conversione toInstant
aggiunto alla vecchia classe.
java.sql.Timestamp ts = myResultSet.getTimestamp( … );
Instant instant = ts.toInstant();
Fuso orario
Applicare il fuso orario desiderato / previsto ( ZoneId
) per ottenere a ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Stringhe formattate
Utilizzare a DateTimeFormatter
per generare la stringa. I codici modello sono simili a quelli di java.text.SimpleDateFormat
ma non esattamente, quindi leggi attentamente il documento.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );
Questo particolare formato è ambiguo per quanto riguarda il suo significato esatto in quanto privo di qualsiasi indicazione di offset da UTC o fuso orario.
ISO 8601
Se hai qualcosa da dire in proposito, ti suggerisco di prendere in considerazione l'utilizzo dei formati ISO 8601 standard anziché di quelli personalizzati. Il formato standard è abbastanza simile al tuo. Ad esempio:
2016-02-20T03:26:32+05:30
.
Le classi java.time utilizzano questi formati standard per impostazione predefinita, quindi non è necessario specificare un modello. La ZonedDateTime
classe estende il formato standard aggiungendo il nome del fuso orario (un saggio miglioramento).
String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]
Converti in java.sql
Puoi convertire da java.time a java.sql.Timestamp
. Estrai un Instant
da ZonedDateTime
.
Nuovi metodi sono stati aggiunti alle vecchie classi per facilitare la conversione in / da classi java.time.
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );
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
.
Il progetto Joda-Time , ora in modalità manutenzione , consiglia la migrazione alle classi java.time .
Per saperne di più, consulta il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .
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 .