1. Datetempo di classe e Unix

Fin dall'inizio di Java, il linguaggio ha avuto una classe speciale per lavorare con orari e date: Date. Nel corso del tempo sono apparse molte altre classi per lavorare con le date, ma i programmatori continuano a utilizzare la Dateclasse anche oggi.

Questo perché è molto semplice e conveniente. E come programmatore, lo incontrerai sicuramente in qualsiasi progetto reale. Se usarlo o meno è una tua scelta, ma devi saperlo. Quindi dedicagli qualche minuto del tuo prezioso tempo.

Cosa rende la Dateclasse così buona? La sua semplicità.

La Dateclasse archivia le informazioni su data e ora come numero di millisecondi trascorsi dal 1° gennaio 1970. Sono molti millisecondi, quindi il longtipo viene utilizzato per archiviarli.

Interessante.

Perché dal 1970 in particolare? Questo è il cosiddetto tempo Unix : è il modo in cui il sistema operativo Unix, che è il nonno di tutti i moderni sistemi operativi, tiene il tempo.

Ma puoi facilmente scoprire quanto tempo è passato tra due date: basta sottrarre una data dall'altra e ottieni la differenza di tempo tra le date al millisecondo più vicino.

Ecco alcuni esempi utili di lavoro con la Dateclasse.


2. Ottenere la data corrente

Per ottenere l'ora e la data correnti, è sufficiente creare un Dateoggetto. Ogni nuovo oggetto memorizza l'ora in cui è stato creato. Sembra molto semplice:

Date current = new Date();

Dopo aver eseguito questo comando, la currentvariabile memorizzerà un riferimento all'oggetto creato Date, che memorizzerà internamente l'ora della sua creazione, ovvero il numero di millisecondi trascorsi dal 1 gennaio 1970.

Visualizzazione della data corrente sullo schermo

Per visualizzare la data corrente è sufficiente: a) creare un nuovo Dateoggetto, b) stamparlo sullo schermo utilizzando il System.out.println()metodo.

Esempio:

Codice Uscita console
Date current = new Date();
System.out.println(current);
Thu Feb 21 14:01:34 EET 2019

Ecco cosa significa l'output della console:

Testo Interpretazione
giovedì _ Giovedì
21 febbraio 21 febbraio
14:01:34 ore : minuti : secondi
EET Fuso orario: ora dell'Europa orientale
2019 Anno

3. Fissare una data specifica

Abbiamo capito come ottenere l'ora corrente, ma come creiamo un Dateoggetto che memorizza una data o un'ora diversa?

Ancora una volta, tutto è semplice qui. Per impostare una data specifica, devi scrivere un codice come questo:

Date birthday = new Date(year, month, day);

Tutto è semplice e ovvio, ma ci sono due sfumature da tenere presente:

  1. L'anno deve essere contato dal 1900.
  2. I mesi sono numerati da zero.
Interessante.

Questa è un'altra eredità del sistema operativo Unix: su Unix, i programmatori indicavano l'anno usando due cifre. Invece di 1977, hanno semplicemente scritto 77. Quindi 77 è l'anno corretto se contiamo dal 1900.

Ad esempio, sono nato il 21 marzo 1989. Marzo è il terzo mese, quindi devo scrivere:

Codice Uscita console
Date current = new Date(89, 2, 21);
System.out.println(current);
Tue Mar 21 00:00:00 EET 1989

I mesi sono numerati da zero, ma i giorni no. È un po' strano, vero?

Pensiamo che i veri programmatori avrebbero dovuto prevalere e numerare anche i giorni del mese da zero. Oh, questi conformisti 🙂

Impostazione di un orario specifico

Anche l'impostazione di un orario specifico è abbastanza semplice: per questo, è necessario scrivere una dichiarazione come questa:

Date birthday = new Date(year, month, day, hour, minutes, seconds);

Ore, minuti e secondi sono numerati da zero: lascia che il programmatore che è in te tiri un sospiro di sollievo.

Esempio:

Codice Uscita console
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current);
Sat Jun 04 12:15:00 EEST 2005

Impostiamo l'ora 12:15 e la data 4 giugno 2005 . Questo è un po' difficile da leggere per un non programmatore, ma funziona come dovrebbe.


4. Lavorare con elementi di una data

Puoi fare di più con un Dateoggetto oltre a visualizzarlo. Ha metodi che ti consentono di ottenere singoli elementi della data memorizzata internamente:

Metodo Descrizione
int getYear()
Restituisce l'anno della data relativa al 1900.
int getMonth()
Restituisce il mese della data (i mesi sono numerati da zero)
int getDate()
Restituisce il giorno del mese
int getDay()
Restituisce il giorno della settimana
int getHours()
Restituisce le ore
int getMinutes()
Restituisce i minuti
int getSeconds()
Restituisce i secondi

Esempio:

Codice Uscita console Nota
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current.getYear());
System.out.println(current.getMonth());
System.out.println(current.getDate());
System.out.println(current.getDay());

105
5
4
6

2005
giugno
giorno del mese
sabato

A proposito, un Dateoggetto non solo ti consente di ottenere singoli elementi di una data, ma anche di modificarli:

Metodo Descrizione
void setYear(int year) Cambia l'anno della data. L'anno è indicato rispetto al 1900.
void setMonth(int month) Cambia il mese della data (i mesi sono numerati da zero)
void setDate(int date) Cambia il giorno del mese
void setHours(int hours) Cambia orario
void setMinutes(int minutes) Cambia minuti
void setSeconds(int seconds) Cambia secondi

5. Millisecondi

Come abbiamo detto in precedenza, l' Dateoggetto memorizza il numero di millisecondi trascorsi dal 1 gennaio 1970.

Se abbiamo bisogno di quel numero, possiamo ottenerlo dall'oggetto Date:

long time = date.getTime();

Il getTime()metodo restituisce il numero di millisecondi memorizzati all'interno dell'oggetto Date.

Non solo puoi ottenere il numero di millisecondi, ma puoi anche modificare quel numero in un oggetto esistente:

Date date = new Date();
date.setTime(1117876500000L);

A proposito, puoi scriverlo in modo ancora più conciso passando il tempo all'oggetto Dateproprio quando viene creato:

Date date = new Date(1117876500000L);

6. Confrontare le date

Se vuoi confrontare due date e scoprire quale è arrivata per prima, hai tre opzioni

Il primo modo è confrontare semplicemente il numero di millisecondi che ciascuno memorizza:

if (date1.getTime() < date2.getTime())

Il secondo modo è usare il before()metodo di un Dateoggetto:

if (date1.before(date2))

Si legge così: se date1viene prima date2, allora...

Il terzo modo è usare il after()metodo di un Dateoggetto:

if (date2.after(date1))

Si legge così: se date2è dopo date1, allora...


7. DateFormatclasse

Ricorda, quando abbiamo visualizzato la data sullo schermo, abbiamo visto qualcosa del genere: Thu Feb 21 14:01:34 EET 2019. Tutto sembra corretto, ma il formato è più come una data verrebbe visualizzata per i programmatori piuttosto che per i normali umani. Vogliamo visualizzare la data in modo più chiaro per gli utenti. Qualcosa come Tuesday, February 21.

E senza l'anno. O con un anno, se necessario. In generale, vogliamo poter visualizzare la data in modi diversi.

C'è una classe speciale per questo: SimpleDateFormat.

Esempio:

Codice
Date current = new Date(105, 5, 4, 12, 15, 0);
SimpleDateFormat formatter = new SimpleDateFormat("MMM-dd-YYYY");
String message = formatter.format(current);
System.out.println(message);
Uscita console
Jun-04-2005

Guarda cosa mostrava il programma: Jun-04-2005. Non è affatto quello che era.

La differenza è che non abbiamo visualizzato l' Dateoggetto stesso, ma una stringa speciale ottenuta chiamando il format()metodo su un SimpleDateFormatoggetto. Ma questo non è nemmeno il punto principale qui.

Quando l' SimpleDateFormatoggetto è stato creato, abbiamo passato la stringa "MMM-dd-YYYY"come parametro. È questa stringa che trasmette il formato della data che alla fine abbiamo visto nell'output della console.

  • MMM indica di visualizzare il nome del mese, abbreviato con tre lettere
  • dd indica di visualizzare il giorno del mese
  • YYYY indica di visualizzare l'anno utilizzando quattro cifre

Se vogliamo emettere il mese come numeri, allora invece di MMM, dobbiamo scrivere MM, che produce lo schema "MM-dd-YYYY". L'output dello schermo sarà06-04-2005

Discuteremo questa classe in modo più dettagliato in seguito.


8. Date.parsemetodo

La Dateclasse può fare qualcos'altro di interessante e utile: può ottenere una data da una stringa. Oppure, come dicono i programmatori, può analizzare una stringa.

Ha il parse()metodo speciale per questo. L'analisi è simile a questa:

Date date = new Date();
date.setTime( Date.parse("Jul 06 12:15:00 2019") );

A proposito, questo codice può essere scritto in modo più compatto:

Date date = new Date("Jul 06 12:15:00 2019");

Considereremo l' analisi delle stringhe in modo più dettagliato in altre lezioni.