java.time
L'approccio moderno utilizza le classi java.time che hanno soppiantato le fastidiose classi data-ora legacy in bundle con le prime versioni di Java.
La java.sql.Timestamp
classe è una di queste classi legacy. Non è più necessario. Utilizzare invece Instant
o altre classi java.time direttamente con il database utilizzando JDBC 4.2 e versioni successive.
La Instant
classe rappresenta un momento sulla sequenza temporale in UTC con una risoluzione di nanosecondi (fino a nove (9) cifre di una frazione decimale).
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Se devi interagire con un esistente Timestamp
, converti immediatamente in java.time tramite i nuovi metodi di conversione aggiunti alle vecchie classi.
Instant instant = myTimestamp.toInstant() ;
Per regolare un altro fuso orario, specificare il fuso orario come ZoneId
oggetto. Specificare un nome proprio fuso orario nel formato continent/region
, come ad esempio America/Montreal
, Africa/Casablanca
o Pacific/Auckland
. Non utilizzare mai i 3-4 lettera pseudo-zone come ad esempio EST
o IST
come sono non fusi orari veri e propri, non standardizzati, e nemmeno unico (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Applica a Instant
per produrre un ZonedDateTime
oggetto.
ZonedDateTime zdt = instant.atZone( z ) ;
Per generare una stringa da visualizzare all'utente, cerca Stack Overflow per DateTimeFormatter
trovare molte discussioni ed esempi.
La tua domanda riguarda davvero l'andare nella direzione opposta, dall'immissione dei dati dell'utente agli oggetti data-ora. In genere è meglio suddividere l'immissione dei dati in due parti, una data e un'ora del giorno.
LocalDate ld = LocalDate.parse( dateInput , DateTimeFormatter.ofPattern( "M/d/uuuu" , Locale.US ) ) ;
LocalTime lt = LocalTime.parse( timeInput , DateTimeFormatter.ofPattern( "H:m a" , Locale.US ) ) ;
La tua domanda non è chiara. Vuoi interpretare la data e l'ora inserite dall'utente in UTC? O in un altro fuso orario?
Se si intende UTC, creare un OffsetDateTime
con un offset usando la costante per UTC, ZoneOffset.UTC
.
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;
Se intendevi un altro fuso orario, combina insieme a un oggetto fuso orario, a ZoneId
. Ma quale fuso orario? Potresti rilevare un fuso orario predefinito. Oppure, se critico, devi confermare con l'utente per essere certo della sua intenzione.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Per ottenere un oggetto più semplice che sia sempre in UTC per definizione, estrai un file Instant
.
Instant instant = odt.toInstant() ;
…o…
Instant instant = zdt.toInstant() ;
Invia al tuo database.
myPreparedStatement.setObject( … , instant ) ;
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 .
Dove ottenere le classi java.time?
- Java SE 8 , Java SE 9 e versioni successive
- Incorporato.
- 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 a Java 6 e 7 in ThreeTen-Backport .
- Android
- Versioni successive delle implementazioni di bundle Android delle classi java.time.
- Per precedenza Android, 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 .