tl; dr
consigliare l'attuale "best practice" in giro DateeCalendar
E 'meglio per favorire sempre Calendarpiù 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 Instantclasse 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/Casablancao Pacific/Auckland. Non usare mai il 3-4 lettera sigla come ad esempio ESTo ISTcome 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 OffsetDateTimeclasse.
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, LocalDatee LocalTimeintenzionalmente 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 ZonedDateTimeanziché 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, YearQuartere altro .