tl; dr
Il progetto Joda-Time è in modalità di manutenzione, ora soppiantato dalle classi java.time .
- Usa solo la
java.time.Instant
classe.
- Non c'è bisogno di:
LocalDateTime
java.sql.Timestamp
- stringhe
Cattura il momento attuale in UTC.
Instant.now()
Per memorizzare quel momento nel database:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
Per recuperare quel momento dal database:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
Per regolare l'ora dell'orologio da parete a quella di un particolare fuso orario.
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime
è la classe sbagliata
Altre risposte sono corrette, ma non indicano che LocalDateTime
è la classe sbagliata per il tuo scopo.
Sia in java.time che in Joda-Time , LocalDateTime
manca volutamente qualsiasi concetto di fuso orario o offset-da-UTC. In quanto tale, non rappresenta un momento e non è un punto sulla sequenza temporale. A LocalDateTime
rappresenta un'idea approssimativa del potenziale momenti in un intervallo di circa 26-27 ore.
Utilizzare a LocalDateTime
per quando la zona / offset è sconosciuta (non è una buona situazione) o quando l'offset di zona è indeterminato. Ad esempio, "Natale inizia al primo momento del 25 dicembre 2018" sarebbe rappresentato come un LocalDateTime
.
Usa a ZonedDateTime
per rappresentare un momento in un particolare fuso orario. Ad esempio, il Natale che inizia in una zona particolare come Pacific/Auckland
o America/Montreal
sarebbe rappresentato con un ZonedDateTime
oggetto.
Per un momento sempre in UTC, usa Instant
.
Instant instant = Instant.now() ; // Capture the current moment in UTC.
Applica un fuso orario. Stesso momento, stesso punto sulla sequenza temporale, ma visualizzato con un orario dell'orologio da parete diverso.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
Quindi, se posso solo convertire tra LocalDate e LocalDateTime,
No, strategia sbagliata. Se si dispone di un valore di sola data e si desidera un valore di data e ora, è necessario specificare un'ora del giorno. Quell'ora del giorno potrebbe non essere valida in quella data per una zona particolare, nel qual caso la ZonedDateTime
classe regola automaticamente l'ora come necessario.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ; // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Se vuoi che il primo momento della giornata sia l'ora del giorno, lascia che java.time determini quel momento. Non dare per scontato che la giornata inizi alle 00:00:00. Anomalie come l'ora legale (DST) indicano che il giorno può iniziare in un altro momento come l'01: 00:00.
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
java.sql.Timestamp
è la classe sbagliata
La java.sql.Timestamp
fa parte delle classi fastidiosi vecchi data-ora che sono ora patrimonio, soppiantato interamente dai java.time classi. Quella classe è stata utilizzata per rappresentare un momento in UTC con una risoluzione di nanosecondi . Quello scopo è ora servito con java.time.Instant
.
JDBC 4.2 con getObject
/setObject
A partire da JDBC 4.2 e versioni successive, il tuo driver JDBC può scambiare direttamente oggetti java.time con il database chiamando:
Per esempio:
myPreparedStatement.setObject( … , instant ) ;
… e …
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Converti legacy ⬌ moderno
Se è necessario interfacciarsi con il vecchio codice non ancora aggiornato a java.time , eseguire la conversione avanti e indietro utilizzando nuovi metodi aggiunti alle vecchie classi.
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
…e…
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy class.
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à di manutenzione , consiglia la migrazione alle classi java.time .
Per saperne di più, vedere 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. Utilizza un driver JDBC compatibile con JDBC 4.2 o successivo. Non c'è bisogno di stringhe, non c'è bisogno di java.sql.*
classi.
Dove ottenere le classi java.time?
- Java SE 8 , Java SE 9 e versioni successive
- Built-in.
- Parte dell'API Java standard con un'implementazione in bundle.
- Java 9 aggiunge alcune funzionalità e correzioni minori.
- Java SE 6 e Java SE 7
- Gran parte delle funzionalità java.time sono portate indietro su Java 6 e 7 in ThreeTen-Backport .
- androide
- Versioni successive delle implementazioni di bundle Android delle classi java.time.
- Per precedenza Android (<26), il ThreeTenABP progetto si adatta ThreeTen-Backport (di cui sopra). Vedi Come usare ThreeTenABP… .
Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili future aggiunte a java.time. Si possono trovare alcune classi utili, come per esempio Interval
, YearWeek
, YearQuarter
e altro .
java.sql.Timestamp
classe è ora legacy, soppiantata dalle classi java.time , in particolare daInstant
.