Calcolatrice tempo di vita

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