tl; dr
Instant.now()
java.time
Le fastidiose vecchie classi data-ora in bundle con le prime versioni di Java sono state soppiantate dalle classi java.time integrate in Java 8 e versioni successive. Vedi Oracle Tutorial . Molte delle funzionalità sono state portate indietro a Java 6 e 7 in ThreeTen-Backport e ulteriormente adattate ad Android in ThreeTenABP .
Instant
Un Instant
rappresenta un momento sulla timeline in UTC con una risoluzione fino a nanosecondi .
Instant instant = Instant.now();
Il toString
metodo genera un oggetto String con testo che rappresenta il valore di data e ora utilizzando uno dei formati ISO 8601 standard .
String output = instant.toString();
2016-06-27T19: 15: 25.864Z
La Instant
classe è una classe elementare di base in java.time. Questa dovrebbe essere la tua lezione quando gestisci la data e l'ora, poiché generalmente la best practice è quella di monitorare, archiviare e scambiare i valori di data e ora in UTC.
OffsetDateTime
Ma Instant
ha limitazioni come nessuna opzione di formattazione per la generazione di stringhe in formati alternativi. Per una maggiore flessibilità, converti da Instant
a OffsetDateTime
. Specificare un offset da UTC . In java.time ciò significa un ZoneOffset
oggetto. Qui vogliamo restare con UTC (+00) in modo da poter usare la comoda costante ZoneOffset.UTC
.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
2016-06-27T19: 15: 25.864Z
Oppure salta la Instant
lezione.
OffsetDateTime.now( ZoneOffset.UTC )
Ora con un OffsetDateTime
oggetto in mano, puoi usarlo DateTimeFormatter
per creare oggetti String con testo in formati alternativi. Cerca in Stack Overflow molti esempi di utilizzo DateTimeFormatter
.
ZonedDateTime
Quando si desidera visualizzare l' ora dell'orologio da parete per un determinato fuso orario, applicare a ZoneId
per ottenere a ZonedDateTime
.
In questo esempio applichiamo il fuso orario di Montréal. In estate, sotto l' assurdità dell'ora legale (DST) , la zona ha un offset di -04:00
. Quindi nota come l'ora del giorno è quattro ore prima nell'output, 15
invece delle 19
ore. Instant
ed ZonedDateTime
entrambi rappresentano lo stesso momento simultaneo, appena visto attraverso due lenti differenti.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
2016-06-27T15: 15: 25,864-04: 00 [America / Montreal]
Conversione
Anche se dovresti evitare le vecchie classi data-ora, se devi puoi convertire usando nuovi metodi aggiunti alle vecchie classi. Qui usiamo java.util.Date.from( Instant )
e java.util.Date::toInstant
.
java.util.Date utilDate = java.util.Date.from( instant );
E andando nella direzione opposta.
Instant instant= utilDate.toInstant();
Allo stesso modo, cerca nuovi metodi aggiunti a GregorianCalendar
(sottoclasse di Calendar
) da convertire in e da java.time.ZonedDateTime
.
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. Hibernate 5 e JPA 2.2 supportano java.time .
Dove ottenere le classi java.time?
java.util.Date
non è mai una data della macchina locale. È sempre definito come millisecondi trascorsi dal 1970-01-01 rispetto a UTC + 00: 00. Forse il comportamento del suo metodotoString()
ti confonde che in effetti usa una rappresentazione nel fuso orario locale.