Come calcolare il tempo trascorso da ora con Joda-Time?
Domanda
Devo calcolare il tempo trascorso da una data specifica fino ad ora e mostralo con lo stesso formato di StackOverFlow Domande, cioè:
15s ago
2min ago
2hours ago
2days ago
25th Dec 08
Sai come raggiungerlo con il Java Joda-time biblioteca? Esiste un metodo helper là fuori che lo implementa già o dovrei scrivere da solo l'algoritmo?
Soluzione
Per calcolare il tempo trascorso con jodatime, usa Period
. Per formattare il tempo trascorso nella rappresentazione umana desiderata, usa PeriodFormatter
che puoi costruire da 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 stampe ormai
3 seconds ago 51 minutes ago 7 hours ago 6 days ago 10 months ago 31 years ago
(Tosse, vecchio, tosse) Vedi che ho preso in considerazione anche mesi e anni e l'ho configurato per omettere i valori quando sono zero.
Altri suggerimenti
Uso Prettytime Per un tempo semplice trascorso.
Provai Humantime Come ha risposto @sfussenegger e usando jodatime Period
ma il metodo più semplice e pulito per il tempo trascorso leggibile umano che ho trovato è stato il Prettytime biblioteca.
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 la funzionalità più precisa della biblioteca, ma produce alcuni risultati dispari, quindi usalo con cura e in progetti non minacciosi.
JP
Puoi farlo con unaformatter per periodi ma non devi andare allo sforzo di creare il tuo periodo di formaggio come in Altre risposte. Se si adatta al tuo caso, puoi semplicemente utilizzare il formatter predefinito:
Period period = new Period(startDate, endDate);
System.out.println(PeriodFormat.getDefault().print(period))
(Suggerimento per il cappello a questa risposta Su una domanda simile, sto incrociato per la scoperta)
C'è una piccola classe di aiuto chiamata Humantime di cui sono abbastanza contento.