¿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 Java Joda-Time library ? ¿Hay un método auxiliar que ya lo implementa, o debo escribir el algoritmo yo mismo?

Author: Basil Bourque, 2010-02-01

4 answers

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

Aquí hay un ejemplo de lanzamiento:

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 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 he tomado meses y años en cuenta también y lo configuré para omitir los valores cuando esos son cero.

 111
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-17 20:29:11

Use PrettyTime para el Tiempo Transcurrido Simple.

Probé HumanTime como respondió @sfussenegger y usando Periodde JodaTime, pero el método más fácil y limpio para el tiempo transcurrido legible por humanos que encontré fue la biblioteca PrettyTime .

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

Hace Cinco Minutos

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 el la funcionalidad de la biblioteca es más precisa, pero produce algunos resultados extraños, así que úsala con cuidado.

JP

 16
Author: Joshua Pinter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-03 14:43:24

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

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

(sombrero punta a esta respuesta en una pregunta similar, estoy cross-posting para la visibilidad)

 10
Author: snappieT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:09:44

Hay una pequeña clase auxiliar llamada HumanTime con la que estoy bastante contento.

 7
Author: sfussenegger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-01 20:13:09