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 Instantrappresenta un momento sulla timeline in UTC con una risoluzione fino a nanosecondi .
Instant instant = Instant.now();
Il toStringmetodo 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 Instantclasse è 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 Instantha limitazioni come nessuna opzione di formattazione per la generazione di stringhe in formati alternativi. Per una maggiore flessibilità, converti da Instanta OffsetDateTime. Specificare un offset da UTC . In java.time ciò significa un ZoneOffsetoggetto. 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 Instantlezione.
OffsetDateTime.now( ZoneOffset.UTC )
Ora con un OffsetDateTimeoggetto in mano, puoi usarlo DateTimeFormatterper 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 ZoneIdper 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, 15invece delle 19ore. Instanted ZonedDateTimeentrambi 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.Datenon è 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.