001package common;
002
003import java.time.Instant;
004import java.time.LocalDate;
005import java.time.ZoneId;
006import java.time.temporal.ChronoUnit;
007
008/**
009 * Classe di utilità contenente funzioni per la stampa di date nella view
010 */
011public final class DateUtils {
012    /**
013     * <p>Questa funzione restituisce un messaggio indicante il tempo trascorso tra il tempo di invocazione del metodo al tempo
014     * passato come parametro.</p>
015     * <p>Ad esempio, se il tempo passato come parametro corrisponde al 05/03/2022 16:00:00Z e il metodo è stato invocato alle
016     * 16:00:05 dello stesso giorno, il metodo restituirà una stringa contenente "5 secondi fa"</p>.
017     * @param then Il tempo di riferimento
018     * @return Il messaggio "x secondi/minuti/ore/giorni/mesi/anni fa"
019     */
020    public static String printTimeSince(Instant then){
021        long n;
022        if ((n = Math.abs(Instant.now().until(then, ChronoUnit.SECONDS))) < 60){
023            return n == 1 ? n + " secondo" : n + " secondi";
024        } else if ((n = Math.abs(Instant.now().until(then, ChronoUnit.MINUTES))) < 60){
025            return n == 1 ? n + " minuto" : n + " minuti";
026        } else if ((n = Math.abs(Instant.now().until(then, ChronoUnit.HOURS))) < 24){
027            return n == 1 ? n + " ora" : n + " ore";
028        } else if ((n = Math.abs(Instant.now().until(then, ChronoUnit.DAYS))) < 30) {
029            return n == 1 ? n + " giorno" : n + " giorni";
030        } else if ((n = Math.abs(Instant.now().until(then, ChronoUnit.DAYS))) < 365) {
031            n /= 30;
032            return n == 1 ? n + " mese" : n + " mesi";
033        } else {
034            int thenYear = then.atZone(ZoneId.systemDefault()).toLocalDate().getYear();
035            n = Math.abs(thenYear - LocalDate.now().getYear());
036            return n == 1 ? n + " anno" : n + " anni";
037        }
038    }
039}