L’API Data e Ora è una delle caratteristiche più importanti del rilascio di Java 8. Java mancava di un approccio coerente per la gestione di Data e Ora fin dall’inizio e l’API Data e Ora di Java 8 è un’aggiunta gradita alle API di base di Java.
Perché abbiamo bisogno della nuova API Java Data e Ora?
Prima di iniziare a esaminare l’API Data e Ora di Java 8, vediamo perché abbiamo bisogno di una nuova API per questo. Ci sono stati diversi problemi con le classi esistenti relative a data e ora in Java, alcuni di essi sono:
- Le classi Data e Ora di Java non sono definite in modo coerente, abbiamo la classe Data sia nel package java.util che in quello java.sql. Inoltre, le classi di formattazione e analisi sono definite nel package java.text.
- java.util.Date contiene sia valori di data che di ora, mentre java.sql.Date contiene solo il valore della data. Avere questo nel package java.sql non ha senso. Inoltre, entrambe le classi hanno lo stesso nome, il che è un design molto cattivo di per sé.
- Non ci sono classi chiaramente definite per tempo, timestamp, formattazione e analisi. Abbiamo la classe astratta java.text.DateFormat per l’analisi e la formattazione necessarie. Di solito, la classe SimpleDateFormat viene utilizzata per l’analisi e la formattazione.
- Tutte le classi Data sono mutabili, quindi non sono thread-safe. È uno dei problemi più grandi con le classi Data e Calendar di Java.
- La classe Date non fornisce l’internazionalizzazione, né il supporto per i fusi orari. Quindi le classi java.util.Calendar e java.util.TimeZone sono state introdotte, ma hanno anche tutti i problemi elencati sopra.
Ci sono alcuni altri problemi con i metodi definiti nelle classi Date e Calendar, ma i problemi sopra elencati chiariscono che era necessaria una robusta API per la data e l’ora in Java. Ecco perché Joda Time ha svolto un ruolo chiave come sostituto di qualità per i requisiti di data e ora di Java.
Principi di progettazione della data e ora di Java 8
L’API di data e ora di Java 8 è un’implementazione di JSR-310. È progettata per superare tutti i difetti delle implementazioni legacy della data e dell’ora. Alcuni dei principi di progettazione della nuova API di data e ora sono:
-
Immutabilità: Tutte le classi nella nuova API di data e ora sono immutabili e adatte per ambienti multithreading.
-
Separazione delle preoccupazioni: La nuova API separa chiaramente tra data e ora leggibili dall’uomo e tempo macchina (timestamp Unix). Definisce classi separate per Data, Ora, DataOra, Timestamp, Fuso Orario, ecc.
-
Chiarezza: I metodi sono chiaramente definiti e svolgono la stessa azione in tutte le classi. Ad esempio, per ottenere l’istanza corrente abbiamo il metodo now(). Sono definiti metodi format() e parse() in tutte queste classi piuttosto che avere una classe separata per essi.
Tutte le classi utilizzano il Pattern Factory e il Pattern Strategy per una migliore gestione. Una volta utilizzati i metodi in una delle classi, lavorare con altre classi non sarà difficile.
-
Operazioni di utilità: Tutte le nuove classi API Data-Ora sono dotate di metodi per eseguire compiti comuni, come sommare, sottrarre, formattare, analizzare, ottenere la parte separata in data/ora, ecc.
-
Estendibile: La nuova API Data e Ora funziona sul sistema di calendario ISO-8601 ma possiamo usarla anche con altri calendari non ISO.
Pacchetti API Data e Ora
Java 8 API Data e Ora consiste nei seguenti pacchetti.
- java.time: Questo è il pacchetto base della nuova API Data e Ora di Java. Tutte le principali classi di base fanno parte di questo pacchetto, come LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration, ecc. Tutte queste classi sono immutabili e thread-safe. Nella maggior parte dei casi, queste classi saranno sufficienti per gestire requisiti comuni.
- java.time.chrono: Questo pacchetto definisce API generiche per sistemi di calendario non ISO. Possiamo estendere la classe AbstractChronology per creare il nostro sistema di calendario.
- java.time.formato: Questo pacchetto contiene classi utilizzate per formattare e analizzare gli oggetti data-ora. La maggior parte delle volte non li utilizzeremo direttamente perché le classi principali nel pacchetto java.time forniscono metodi di formattazione e analisi.
- java.time.temporale: Questo pacchetto contiene oggetti temporali e possiamo usarlo per trovare le date o gli orari specifici relativi agli oggetti data/ora. Ad esempio, possiamo usare questi per trovare il primo o l’ultimo giorno del mese. È possibile identificare facilmente questi metodi perché hanno sempre il formato “withXXX”.
- Pacchetto java.time.zone: Questo pacchetto contiene classi per supportare diversi fusi orari e le loro regole.
Esempi di classi API di data e ora di Java 8
Abbiamo esaminato la maggior parte delle parti importanti dell’API di data e ora di Java. È ora di esaminare le classi più importanti dell’API di data e ora con degli esempi.
1. LocalDate
LocalDate è una classe immutabile che rappresenta una data con il formato predefinito di yyyy-MM-dd. Possiamo utilizzare il metodo now() per ottenere la data corrente. Possiamo anche fornire argomenti di input per anno, mese e giorno per creare un’istanza di LocalDate.
Questa classe fornisce un metodo sovraccaricato per now() in cui possiamo passare ZoneId per ottenere date in un fuso orario specifico. Questa classe fornisce la stessa funzionalità di java.sql.Date.
La spiegazione dei metodi di LocalDate è fornita nei commenti. Quando eseguiamo questo programma, otteniamo l’output seguente.
2. LocalTime
LocalTime è una classe immutabile il cui istanza rappresenta un’ora nel formato leggibile dall’essere umano. Il suo formato predefinito è hh:mm:ss.zzz. Proprio come LocalDate, questa classe fornisce il supporto per il fuso orario e la creazione dell’istanza mediante il passaggio di ore, minuti e secondi come argomenti di input.
Output:
3. LocalDateTime
LocalDateTime è un oggetto data-ora immutabile che rappresenta una data-ora con il formato predefinito yyyy-MM-dd-HH-mm-ss.zzz. Fornisce un metodo factory che prende gli argomenti di input LocalDate e LocalTime per creare un’istanza di LocalDateTime.
In tutti e tre gli esempi, abbiamo visto che se forniamo argomenti non validi per la creazione di Data/Ora, viene lanciata java.time.DateTimeException, che è una RuntimeException quindi non è necessario catturarla esplicitamente.
Abbiamo anche visto che possiamo ottenere dati Data/Ora passando ZoneId, è possibile ottenere l’elenco dei valori di ZoneId supportati dalla sua JavaDoc. Quando eseguiamo la classe sopra, otteniamo l’output seguente.
4. Istante
La classe Istante viene utilizzata per lavorare con il formato di tempo leggibile dalla macchina. Istante memorizza la data e l’ora nel timestamp Unix.
Output:
Utilità API Data Java 8
La maggior parte delle classi di principio Data e Ora fornisce vari metodi di utilità come più/meno giorni, settimane, mesi ecc. Ci sono alcuni altri metodi di utilità per regolare la data utilizzando il TemporalAdjuster
e per calcolare il periodo tra due date.
Output:
Parsing e formattazione della data in Java 8
È molto comune formattare la data in diversi formati e quindi analizzare una stringa per ottenere gli oggetti Data Time.
Output:
Supporto per date e ora legacy dell’API Java
Le classi Legacy Date/Time sono utilizzate in quasi tutte le applicazioni, quindi avere la compatibilità all’indietro è un must. Ecco perché esistono diversi metodi di utilità attraverso i quali possiamo convertire le classi Legacy in nuove classi e viceversa.
Output:
Come puoi vedere, i metodi toString() delle classi legacy TimeZone e GregorianCalendar sono troppo prolissi e non user-friendly.
Conclusione
I like this new Date Time API a lot. Some of the most used classes will be LocalDate and LocalDateTime. It’s very easy to work with the new classes. And, having similar methods that does a particular job makes it easy to find. It will take some time from moving legacy classes to new Date Time classes, but I believe it will be worth the time and effort.
Source:
https://www.digitalocean.com/community/tutorials/java-8-date-localdate-localdatetime-instant