1. Presentazione dell'API Date Time

Ai creatori di Java non piaceva la situazione con le classi Date e Calendar. Erano bravi ai loro tempi, ma i tempi cambiano. E si è reso necessario qualcosa di semplice, potente e affidabile. E con il rilascio di Java 8 (15 anni dopo Calendarla sua comparsa), è stata introdotta l' API Java Date Time . È un insieme di classi che dovrebbero essere in grado di risolvere ogni possibile compito relativo al tempo.
C'erano così tante classi che sono state suddivise in diversi pacchetti:
Il java.timepacchetto è il pacchetto base per l'API Java Date Time: contiene classi come LocalDate, LocalTime, LocalDateTime, Instant, Periode Duration. Tutti gli oggetti di queste classi sono immutable, il che significa che non possono essere modificati dopo la creazione.
Il java.time.formatpacchetto contiene classi per la formattazione dell'ora, cioè la conversione di ore (e date) in stringhe e viceversa. Ad esempio, contiene la DateTimeFormatterclasse versatile, che sostituisce la SimpleDateFormatclasse.
Il java.time.zonepacchetto contiene classi per lavorare con i fusi orari. Contiene classi come TimeZonee ZonedDateTime. Se stai scrivendo codice server per client situati in diverse parti del mondo, avrai davvero bisogno di queste classi.
2. LocalDateclasse
La prima e più utile classe dell'API Date Time che esamineremo è la LocalDateclasse. Come probabilmente puoi intuire dal nome, questa classe è progettata per funzionare con le date.
Gli oggetti di questa classe non cambiano dopo essere stati creati, cioè la LocalDateclasse è immutabile. Ma questa proprietà aggiunge semplicità e affidabilità alla classe. Soprattutto se più thread (thread di esecuzione) interagiscono contemporaneamente con un tale oggetto.
Per creare un nuovo LocalDateoggetto, è necessario utilizzare uno dei metodi statici. Ecco un elenco dei principali.
Ottenere la data corrente
Per ottenere la data corrente, è necessario utilizzare il now()metodo statico. Questo è molto più facile di quanto sembri:
LocalDate today = LocalDate.now();
Dove todayè una LocalDatevariabile ed LocalDate.now()è una chiamata al now()metodo statico della LocalDateclasse.
Esempio:
| Codice | Uscita console |
|---|---|
|
|
Ottenere una data in un fuso orario specifico
La LocalDateclasse ha anche una variazione del now(ZoneId)metodo che ti consente di ottenere la data corrente in un fuso orario specifico.
Per fare ciò, abbiamo bisogno di un'altra classe: la ZoneIdclasse (java.time.ZoneId). Ha un of()metodo che restituisce un ZoneIdoggetto dato il nome del fuso orario.
Per determinare la data corrente a Shanghai, devi scrivere il seguente codice:
| Codice | Uscita console |
|---|---|
|
|
Puoi trovare un elenco dei nomi di tutti i fusi orari su Internet.
3. Ottenere una data specifica
Per ottenere un LocalDateoggetto che rappresenta una data specifica, è necessario utilizzare il of()metodo statico. Tutto qui è anche molto semplice e chiaro:
LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);
Dove dateè una LocalDatevariabile ed è una chiamata al metodo statico della classe.LocalDate.of()of()LocalDate
Qui vediamo la FEBRUARYcostante della Monthclasse (java.time.Month) utilizzata per specificare febbraio come mese.
Puoi anche specificare il mese alla vecchia maniera, usando un numero:
LocalDate date = LocalDate.of(2019, 2, 22);
Due? Invece di febbraio? Ciò significa che i mesi sono ancora una volta numerati da uno?
Sì, quasi 20 anni dopo la creazione di Java, i mesi hanno finalmente smesso di essere numerati da zero.
Esempio:
| Codice | Uscita console |
|---|---|
|
|
Ottenere una data dall'indice del giorno
C'è un altro modo interessante per creare una data: utilizzando il ofYearDaymetodo, puoi ottenere una data basata solo sul numero dell'anno e sull'indice del giorno nell'anno. Ecco l'aspetto generale:
LocalDate date = LocalDate.ofYearDay(year, day);
Dove yearè il numero dell'anno ed dayè l'indice del giorno dell'anno.
Esempio:
| Codice | Uscita console |
|---|---|
|
|
Il centesimo giorno del 2019 è il 10 aprile.
Ottenere una data Unix
Ricordi che Dategli oggetti hanno sempre memorizzato il tempo come numero di millisecondi dal 1 gennaio 1970? Per assicurarsi che i programmatori non si perdessero i bei vecchi tempi, la LocalDateclasse ha ottenuto un ofEpochDay()metodo che restituisce la data calcolata dal 1° gennaio 1970. Ecco l'aspetto generale:
LocalDate date = LocalDate.ofEpochDay(day);
Dove dayè il numero di giorni trascorsi dal 1 gennaio 1970.
Esempio:
| Codice | Uscita console |
|---|---|
|
|
4. Ottenere elementi di una data
È impossibile modificare LocalDategli oggetti, ma è possibile ottenere singoli elementi della data memorizzata. LocalDategli oggetti hanno diversi metodi per questo:
| Metodo | Descrizione |
|---|---|
|
Restituisce l'anno di una data specifica |
|
Restituisce il mese della data: una delle diverse costantiJANUARY, FEBRUARY, ...; |
|
Restituisce l'indice del mese della data. Gennaio == 1. |
|
Restituisce l'indice del giorno del mese |
|
Restituisce l'indice del giorno dall'inizio dell'anno |
|
Restituisce il giorno della settimana: una delle diverse costantiMONDAY, TUESDAY, ...; |
|
Restituisce l'era: o BCE(Before Current Era) e CE(Current Era) |
Esempio:
| Codice | Uscita console |
|---|---|
|
|
5. Modifica della data in un LocalDateoggetto
La LocalDateclasse contiene diversi metodi che consentono di lavorare con le date. L'implementazione di questi metodi è analoga ai metodi della Stringclasse: non modificano l' LocalDateoggetto esistente, ma ne restituiscono uno nuovo con i dati desiderati.
Ecco i metodi della LocalDateclasse:
| Metodo | Descrizione |
|---|---|
|
Aggiunge un numero specificato di giorni alla data |
|
Aggiunge settimane alla data |
|
Aggiunge mesi alla data |
|
Aggiunge anni alla data |
|
Sottrae i giorni dalla data |
|
Sottrae settimane dalla data |
|
Sottrae i mesi dalla data |
|
Sottrae anni dalla data |
Esempio:
| Codice | Uscita console |
|---|---|
|
|
I birthday objectcui metodi chiamiamo non cambiano. Invece, i suoi metodi restituiscono nuovi oggetti che contengono i dati desiderati.
GO TO FULL VERSION