tl; dr
consigliare l'attuale "best practice" in giro Date
eCalendar
E 'meglio per favorire sempre Calendar
più diDate
Evita del tutto queste classi legacy . Utilizzare invece le classi java.time .
- Per un momento in UTC , utilizzare (l'equivalente moderno di )
Instant
Date
- Per un momento in un determinato fuso orario , utilizzare (l'equivalente moderno di )
ZonedDateTime
GregorianCalendar
- Per un momento in un particolare offset da UTC , utilizzare (nessun equivalente nelle classi legacy)
OffsetDateTime
- Per una data-ora (non un momento) con fuso orario o offset sconosciuti, utilizzare (nessun equivalente nelle classi legacy)
LocalDateTime
Dettagli
La risposta da Ortomala Lokni è giusto suggerire utilizzando le moderne java.time classi, piuttosto che le classi legacy data-ora vecchi fastidiosi ( Date
, Calendar
, ecc). Ma quella risposta suggerisce la classe sbagliata come equivalente (vedi il mio commento su quella risposta).
Utilizzando java.time
Le classi java.time rappresentano un notevole miglioramento rispetto alle classi di data e ora legacy, differenza diurna e giornaliera. Le vecchie classi sono mal progettate, confuse e problematiche. Dovresti evitare le vecchie lezioni quando possibile. Ma quando è necessario convertire in / dal vecchio / nuovo, è possibile farlo chiamando nuovi metodi da aggiungere alle vecchie classi.
Per ulteriori informazioni sulla conversione, vedere la mia risposta e il diagramma elegante in un'altra domanda, Converti java.util.Data in quale tipo di "java.time"? .
La ricerca di Stack Overflow offre molte centinaia di esempi di domande e risposte sull'uso di java.time. Ma ecco una breve sinossi.
Instant
Ottieni il momento attuale con un Instant
. La Instant
classe rappresenta un momento sulla linea temporale in UTC con una risoluzione di nanosecondi (fino a nove (9) cifre di una frazione decimale).
Instant instant = Instant.now();
ZonedDateTime
Per vedere lo stesso momento simultaneo attraverso l'obiettivo dell'ora dell'orologio a parete di una particolare regione , applica un fuso orario ( ZoneId
) per ottenere un ZonedDateTime
.
Fuso orario
Specificare un nome proprio fuso orario nel formato continent/region
, come ad esempio America/Montreal
, Africa/Casablanca
o Pacific/Auckland
. Non usare mai il 3-4 lettera sigla 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" );
ZonedDateTime zdt = instant.atZone();
Compensare
Un fuso orario è la cronologia delle modifiche di una regione nel suo offset da UTC . Ma a volte ti viene dato solo un offset senza la zona intera. In tal caso, utilizzare la OffsetDateTime
classe.
ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );
L'uso di un fuso orario è preferibile all'uso di un semplice offset.
LocalDateTime
Il "Locale" nelle Local…
classi indica qualsiasi località, non una località particolare. Quindi il nome può essere contro-intuitivo.
LocalDateTime
, LocalDate
e LocalTime
intenzionalmente privo di informazioni su offset o fuso orario. Quindi essi non rappresentano momenti attuali, sono senza punti sulla timeline. In caso di dubbi o confusione, utilizzare ZonedDateTime
anziché LocalDateTime
. Cerca Stack Overflow per ulteriori discussioni.
stringhe
Non confondere gli oggetti data-ora con stringhe che rappresentano il loro valore. È possibile analizzare una stringa per ottenere un oggetto data-ora e generare una stringa da un oggetto data-ora. Ma la stringa non è mai la data-ora stessa.
Informazioni sui formati ISO 8601 standard , utilizzati per impostazione predefinita nelle classi java.time.
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 .
Utilizzando un driver JDBC conforme a JDBC 4.2 o successivo, è possibile scambiare oggetti java.time direttamente con il database. Non sono necessarie stringhe né classi java.sql. *.
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 della funzionalità java.time è trasferita su Java 6 e 7 in ThreeTen-Backport .
- androide
- Versioni successive di 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 aggiunte future a java.time. Si possono trovare alcune classi utili, come per esempio Interval
, YearWeek
, YearQuarter
e altro .