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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top