DateUtils.java

package common;

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;

/**
 * Classe di utilità contenente funzioni per la stampa di date nella view
 */
public final class DateUtils {
    /**
     * <p>Questa funzione restituisce un messaggio indicante il tempo trascorso tra il tempo di invocazione del metodo al tempo
     * passato come parametro.</p>
     * <p>Ad esempio, se il tempo passato come parametro corrisponde al 05/03/2022 16:00:00Z e il metodo è stato invocato alle
     * 16:00:05 dello stesso giorno, il metodo restituirà una stringa contenente "5 secondi fa"</p>.
     * @param then Il tempo di riferimento
     * @return Il messaggio "x secondi/minuti/ore/giorni/mesi/anni fa"
     */
    public static String printTimeSince(Instant then){
        long n;
        if ((n = Math.abs(Instant.now().until(then, ChronoUnit.SECONDS))) < 60){
            return n == 1 ? n + " secondo" : n + " secondi";
        } else if ((n = Math.abs(Instant.now().until(then, ChronoUnit.MINUTES))) < 60){
            return n == 1 ? n + " minuto" : n + " minuti";
        } else if ((n = Math.abs(Instant.now().until(then, ChronoUnit.HOURS))) < 24){
            return n == 1 ? n + " ora" : n + " ore";
        } else if ((n = Math.abs(Instant.now().until(then, ChronoUnit.DAYS))) < 30) {
            return n == 1 ? n + " giorno" : n + " giorni";
        } else if ((n = Math.abs(Instant.now().until(then, ChronoUnit.DAYS))) < 365) {
            n /= 30;
            return n == 1 ? n + " mese" : n + " mesi";
        } else {
            int thenYear = then.atZone(ZoneId.systemDefault()).toLocalDate().getYear();
            n = Math.abs(thenYear - LocalDate.now().getYear());
            return n == 1 ? n + " anno" : n + " anni";
        }
    }
}