¿Cómo calcular el tiempo transcurrido a partir de ahora con Joda-Time?

Necesito calcular el tiempo transcurrido desde una fecha específica hasta ahora y mostrarlo con el mismo formato que las preguntas de StackOverflow, es decir:

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

¿Sabes cómo lograrlo con la biblioteca Java Joda-Time ? ¿Hay algún método auxiliar que ya lo implemente o debería escribir el algoritmo?

Para calcular el tiempo transcurrido con JodaTime, use Period . Para formatear el tiempo transcurrido en la representación humana deseada, use PeriodFormatter que puede construir mediante PeriodFormatterBuilder .

Aquí hay un ejemplo de inicio:

 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); 

Esto se imprime por ahora

 Hace 3 segundos
 Hace 51 minutos
 hace 7 horas
 Hace 6 días
 Hace 10 meses
 Hace 31 años

(Tos, viejo, tos) Ves que también he tenido en cuenta meses y años y lo configuré para omitir los valores cuando son cero.

Use PrettyTime para Simple Elapsed Time.

Intenté HumanTime respondiendo @sfussenegger y usando el Period de JodaTime, pero el método más fácil y más limpio para el tiempo transcurrido legible para los humanos que encontré fue la biblioteca PrettyTime .

Aquí hay un par de ejemplos simples con entrada y salida:

Cinco minutos antes

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

Hace un tiempo

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

PRECAUCIÓN: He intentado jugar con la funcionalidad más precisa de la biblioteca, pero produce algunos resultados extraños, así que úsela con cuidado.

JP

Puede hacer esto con un PeriodFormatter pero no tiene que hacer el esfuerzo de crear su propio PeriodFormatBuilder como en otras respuestas . Si se adapta a su caso, puede usar el formateador predeterminado:

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

(punta de sombrero a esta respuesta en una pregunta similar, estoy haciendo una publicación cruzada para descubrir)

Hay una pequeña clase de ayuda llamada HumanTime con la que estoy muy contento.