¿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?
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.
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 Period
de 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
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)
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.
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