Come calcolare il tempo trascorso da ora con Joda-Time?

Ho bisogno di calcolare il tempo trascorso da una data specifica fino ad ora e visualizzarlo con lo stesso formato delle domande StackOverflow, cioè:

15s ago 2min ago 2hours ago 2days ago 25th Dec 08 

Sai come ottenerlo con la libreria Java Joda-Time ? Esiste un metodo di supporto che lo implementa già, o dovrei scrivere io stesso l’algoritmo?

Per calcolare il tempo trascorso con JodaTime, utilizzare Period . Per formattare il tempo trascorso nella rappresentazione umana desiderata, usa PeriodFormatter che puoi build con PeriodFormatterBuilder .

Ecco un esempio di kickoff:

 DateTime myBirthDate = new DateTime(1978, 3, 26, 12, 35, 0, 0); DateTime now = new DateTime(); Period period = new Period(myBirthDate, now); PeriodFormatter formatter = new PeriodFormatterBuilder() .appendSeconds().appendSuffix(" seconds ago\n") .appendMinutes().appendSuffix(" minutes ago\n") .appendHours().appendSuffix(" hours ago\n") .appendDays().appendSuffix(" days ago\n") .appendWeeks().appendSuffix(" weeks ago\n") .appendMonths().appendSuffix(" months ago\n") .appendYears().appendSuffix(" years ago\n") .printZeroNever() .toFormatter(); String elapsed = formatter.print(period); System.out.println(elapsed); 

Questo stampa ormai

 3 secondi fa
 51 minuti fa
 7 ore fa
 6 giorni fa
 10 mesi fa
 31 anni fa

(Tosse, vecchia, tosse) Vedi che ho preso in considerazione anche mesi e anni e l’ho configurato per omettere i valori quando questi sono zero.

Usa PrettyTime per il tempo trascorso semplice.

Ho provato HumanTime come risposta @sfussenegger e usando il Period di JodaTime ma il metodo più semplice e più pulito per il tempo trascorso leggibile dall’uomo che ho trovato era la libreria PrettyTime .

Ecco un paio di semplici esempi con input e output:

Cinque minuti fa

 DateTime fiveMinutesAgo = DateTime.now().minusMinutes( 5 ); new PrettyTime().format( fiveMinutesAgo.toDate() ); // Outputs: "5 minutes ago" 

Un po ‘di tempo fa

 DateTime birthday = new DateTime(1978, 3, 26, 12, 35, 0, 0); new PrettyTime().format( birthday.toDate() ); // Outputs: "4 decades ago" 

ATTENZIONE: ho provato a giocare con le funzionalità più precise della libreria, ma produce alcuni risultati strani, quindi usalo con cura.

JP

Puoi farlo con un PeriodFormatter ma non devi impegnarti a creare il tuo PeriodFormatBuilder come in altre risposte . Se è adatto al tuo caso, puoi semplicemente usare il formattatore predefinito:

 Period period = new Period(startDate, endDate); System.out.println(PeriodFormat.getDefault().print(period)) 

(punta a questa risposta su una domanda simile, sto cross-posting per scopribilità)

C’è una piccola class di supporto chiamata HumanTime di cui sono abbastanza felice.