online joda examples dates java algorithm datetime grails jodatime

java - examples - jodatime difference between dates



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

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?


Use PrettyTime para Simple PrettyTime 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 buscar la funcionalidad más precisa de la biblioteca, pero produce algunos resultados extraños, así que úsela con cuidado.

JP


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


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

3 seconds ago 51 minutes ago 7 hours ago 6 days ago 10 months ago 31 years ago

(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.


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)