1. Presentazione dell'API Date Time

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
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

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
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

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
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

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
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

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
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

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
int getYear()
Restituisce l'anno di una data specifica
Month getMonth()
Restituisce il mese della data: una delle diverse costanti
JANUARY, FEBRUARY, ...;
int getMonthValue()
Restituisce l'indice del mese della data. Gennaio == 1.
int getDayOfMonth()
Restituisce l'indice del giorno del mese
int getDayOfYear()
Restituisce l'indice del giorno dall'inizio dell'anno
DayOfWeek getDayOfWeek()
Restituisce il giorno della settimana: una delle diverse costanti
MONDAY, TUESDAY, ...;
IsoEra getEra()
Restituisce l'era: o BCE(Before Current Era) e CE(Current Era)

Esempio:

Codice Uscita console
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

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
plusDays(int days)
Aggiunge un numero specificato di giorni alla data
plusWeeks(int weeks)
Aggiunge settimane alla data
plusMonths(int months)
Aggiunge mesi alla data
plusYears(int years)
Aggiunge anni alla data
minusDays(int days)
Sottrae i giorni dalla data
minusWeeks(int weeks)
Sottrae settimane dalla data
minusMonths(int months)
Sottrae i mesi dalla data
minusYears(int years)
Sottrae anni dalla data

Esempio:

Codice Uscita console
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

I birthday objectcui metodi chiamiamo non cambiano. Invece, i suoi metodi restituiscono nuovi oggetti che contengono i dati desiderati.