Vediamo una applicazione simpatica in cui l’utente inserisce la propria data di nascita e in automatico il nostro software Java calcola il tempo di vita trascorso secondo grandezze quali anni, mesi, minuti ecc. E’ un’approssimazione che non tiene conto di anni bisestili e approssima i mesi a 30 giorni. E’ comunque un’ottima occasione per vedere la gestione delle date in Java che non è proprio limpida e semplice.
Trovate in allegato il sorgente e l’eseguibile. Qui sotto riportiamo per commentare assieme solo la parte principale del nostro software. Per il momento abbiamo esplicitamente deciso di non ricorrere ad una programmazione orientata agli oggetti, ma rimaniamo, per semplicità, ad un ibrido topdown. Riporto qui sotto l’actionPerformed del bottone Calcola. Il primo blocco di righe preleva l’informazione dalle caselle di testo, sotto forma di stringa. In genere va fatto il cast esplicito, perché il getSelectedItem ritorna un oggetto generico. Il blocco successivo fa la conversione/cast ad intero delle grandezze inserite. A quel punto possiamo crearci due oggetti standard LocalDateTime, uno con la data inserita, uno con la data corrente (now). Trasfromiamo le date il secondi e ne facciamo la differenza. A quel punto, è facile ricostruire le grandezze che cerchiamo di minuti, ore, giorni, mesi. Al lettore l’esercizio di conteggiare le settimane, di implementare la funzionalità del bottone cancella che sbianca le caselle e di creare un iteratore che aumenta le grandezze di secondo in secondo.
String sgiorno = (String)jGiorno.getSelectedItem();
String smese = (String)jMese.getSelectedItem();
String sanno = (String)jAnno.getSelectedItem();
String sora = (String)jOra.getSelectedItem();
int giorno = Integer.parseInt(sgiorno);
int mese = Integer.parseInt(smese);
int ora = Integer.parseInt(sora);
int anno = Integer.parseInt(sanno);
LocalDateTime datefrom = LocalDateTime.of(anno, mese, giorno,ora,0);
LocalDateTime datenow = LocalDateTime.now();
long datefromsec=datefrom.toEpochSecond(ZoneOffset.UTC);
long datenowsec=datenow.toEpochSecond(ZoneOffset.UTC);
long msdiff = datenowsec - datefromsec;
long mdiff = msdiff / 60;
long orediff = mdiff / 60;
long giornidiff = orediff / 24;
int annidiff = (int)giornidiff / 365;
GiorniDiff.setText(String.valueOf(giornidiff));
EtaDiff.setText(String.valueOf(annidiff));
MesiDiff.setText(String.valueOf(giornidiff/30));
SecondiDiff.setText(String.valueOf(msdiff));
MinutiDiff.setText(String.valueOf(mdiff));
Il codice completo ->
Ultima modifica 21 Febbraio 2022