1. Passaggio dalla Dateclasse alla Calendarclasse

I programmatori adoravano la Dateclasse per la sua semplicità e il supporto per gli standard Unix, ma come sai, ogni rosa ha le sue spine.

I programmatori volevano una Dateclasse "intelligente". E hanno ottenuto ciò che volevano sotto forma di Calendarclasse. È stato concepito come un modo non solo per memorizzare le date, ma anche per eseguire operazioni difficili con le date.

Il nome completo della Calendarclasse è java.util.Calendar. Non dimenticare di aggiungerlo a un'istruzione import se decidi di usarlo nel tuo codice.

Puoi creare un Calendaroggetto con questo comando:

Calendar date = Calendar.getInstance();

Il metodo statico getInstance()della Calendarclasse crea un Calendaroggetto inizializzato con la data corrente. Il calendario desiderato verrà creato in base alle impostazioni del computer che esegue il programma.

O più precisamente, il calendario che ottieni... Questo perché gli esseri umani sulla Terra non sono limitati a un singolo calendario. Invece ne usano molti. E quasi ognuno di loro è associato a qualche religione o paese. La Calendarclasse ne supporta 3:

Calendario Descrizione
Calendario gregoriano Calendario gregoriano cristiano
Calendario buddista Calendario buddista
Calendario imperiale giapponese Calendario imperiale giapponese

Ma ci sono anche calendari cinesi e arabi. Fondamentalmente, lavorare con il tempo non è così facile come sembra.

Nel calendario cinese, l'anno è ufficialmente 4716 al momento della stesura di questa lezione. E secondo il calendario musulmano, l'anno è il 1398. Benvenuto nel grande mondo, mio ​​amico programmatore.

2. Creazione di un oggetto calendario

Useremo il calendario gregoriano, poiché è il più comune al mondo. Almeno fino a quando la Cina non acquisterà Oracle e renderà il calendario cinese quello principale.

Puoi creare un oggetto calendario con qualsiasi data utilizzando un'istruzione come questa:

Calendar date = new GregorianCalendar(year, month, day);

Sì, devi scrivere GregorianCalendarogni volta. Invece di Calendar, puoi anche scrivere GregorianCalendar— anche questo funzionerà. Ma scrivere Calendarè solo più breve.

L'anno deve essere scritto per intero, ad esempio non si può scrivere 19 invece di 2019. I mesi sono comunque numerati a partire da zero. Ma come prima, i giorni del mese non si contano da zero. Secchioni!

Per impostare l'ora e la data, è necessario passare l'ora come argomenti aggiuntivi:

... = new GregorianCalendar(year, month, day, hours, minutes, seconds);

Puoi anche passare in millisecondi se necessario. Sono il parametro dopo il numero di secondi.

3. Visualizzazione di un oggetto calendario sullo schermo

Se stampi semplicemente un oggetto calendario sullo schermo, non sarai molto soddisfatto del risultato.

Codice
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Uscita console
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Helsinki",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=118,lastRule=java.util.SimpleTimeZone[id=Europe/Helsinki,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2019,MONTH=3,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=12,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]

La cosa da tenere a mente qui è che un calendario è un calendario, non una data : ha tutti i tipi di impostazioni che verranno tutte visualizzate sullo schermo.

Sarebbe appropriato usare un SimpleDateFormatoggetto per visualizzare un calendario, ma finché non lo studiamo, puoi usare questo trucchetto.

Date date = calendar.getTime();

Un Calendaroggetto può essere facilmente convertito in un Dateoggetto e sai già come visualizzare un Dateoggetto. Puoi usare un codice come questo per convertire un Calendaroggetto in un Date:

Utilizzando il getTime()metodo:

Codice Uscita console
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

Questa è una questione completamente diversa, non è vero?

4. Lavorare con elementi di una data

Per ottenere un elemento specifico di una data (ad esempio l'anno, il mese, ...), la Calendarclasse ha il get()metodo. È un singolo metodo, ma ha parametri:

int month = calendar.get(Calendar.MONTH);

Dove calendarè una Calendarvariabile ed MONTHè un campo costante della Calendarclasse.

Si passa uno dei Calendarcampi costanti della classe come argomento al getmetodo e si ottiene il valore desiderato come risultato.

Esempi

Codice Descrizione
Calendar calendar = Calendar.getInstance();

int era = calendar.get(Calendar.ERA);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);


era (prima o dopo l'era volgare)
anno
mese
giorno del mese

giorno della settimana
ore
minuti
secondi

Per modificare un elemento di una data, utilizzare il setmetodo:

calendar.set(Calendar.MONTH, value);

Dove calendarè una Calendarvariabile ed MONTHè un campo costante della Calendarclasse.

Quando si lavora con setmetodo, si passa uno dei Calendarcampi costanti della classe come primo argomento e il nuovo valore come secondo argomento.

Esempi

Codice Descrizione
Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 6);
calendar.set(Calendar.DAY_OF_MONTH, 4);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 15);
calendar.set(Calendar.SECOND, 0);

System.out.println(calendar.getTime());


anno = 2019
mese = luglio (numerato da 0)
4° giorno
ore
minuti
secondi

5. Costanti della Calendarclasse

I campi costanti della Calendarclasse non si limitano a quelli per denominare gli elementi di una data. Sembra che ci siano campi per ogni occasione.

Calendar date = new GregorianCalendar(2019, Calendar.JANUARY, 31);

Ad esempio, ci sono campi costanti per fare riferimento ai mesi:

E anche i giorni della settimana:

Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
   System.out.println("It's Friday");
}

Non elencheremo tutto. Semplicemente non vogliamo che tu sia sorpreso se vedi costanti come questa nel codice.

L'uso delle costanti rende il codice più leggibile, motivo per cui i programmatori le usano. E i mesi sono numerati da zero anche per migliorare la leggibilità. O no.

6. Modifica della data in un Calendaroggetto

La Calendarclasse ha un metodo che ti consente di operare su una data in modi più intelligenti. Ad esempio, puoi aggiungere un anno, un mese o diversi giorni a una data. Oppure portali via. Questo metodo si chiama add(). Lavorare con esso assomiglia a questo:

calendar.add(Calendar.MONTH, value);

Dove calendarè una Calendarvariabile ed MONTHè un campo costante della Calendarclasse.

Quando si lavora con addmetodo, si passa uno dei Calendarcampi costanti della classe come primo argomento e come secondo argomento — il nuovo valore da aggiungere.

Questo è un altro metodo intelligente. Vediamo quanto è intelligente:

Codice
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
Uscita console
Fri Mar 01 00:00:00 EET 2019

Questo metodo comprende che ci sono solo 28 giorni a febbraio 2019, quindi la data risultante è il 1 marzo.

Ora togliamoci 2 mesi! Cosa dovremmo ottenere? 27 dicembre 2018! Controlliamo ora.

Per eseguire un'operazione che risulta in una data precedente, è necessario passare un valore negativo al add()metodo:

Codice
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Uscita console
Thu Dec 27 00:00:00 EET 2018

Funziona!

Questo metodo tiene conto delle diverse lunghezze dei mesi e degli anni bisestili. Insomma, un ottimo metodo. È esattamente ciò di cui ha bisogno la maggior parte dei programmatori che lavorano con le date.

7. Elementi scorrevoli di una data

Ma a volte ci sono situazioni in cui non vogliamo questo comportamento intelligente, ad esempio vuoi fare qualcosa per una parte della data senza cambiare tutto il resto.

La Calendarclasse ha il roll()metodo speciale per questo. La sua firma è proprio come il add()metodo, ma questo metodo cambia solo un elemento della data, lasciando il resto invariato.

Esempio:

Codice
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Uscita console
Fri Dec 27 00:00:00 EET 2019

Abbiamo cambiato il mese, ma l'anno e la data sono rimasti invariati.