¿Cómo calcular el tiempo transcurrido a partir de ahora con el tiempo de Joda?
Pregunta
Necesito calcular el 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 el Java? Joda-tiempo biblioteca? ¿Hay un método de ayuda que ya lo implementa, o debería escribir el algoritmo yo mismo?
Solución
Para calcular el tiempo transcurrido con Jodatime, use Period
. Para formatear el tiempo transcurrido en la representación humana deseada, use PeriodFormatter
que puedes construir 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 ahora
3 seconds ago 51 minutes ago 7 hours ago 6 days ago 10 months ago 31 years ago
(Tos, viejo, tos) Usted ve que he tenido en cuenta los meses y años y lo configuré para omitir los valores cuando son cero.
Otros consejos
Usar Bonito tiempo Para el simple tiempo transcurrido.
Lo intenté Humant Como @SfussEnegger respondió y usando Jodatime's Period
Pero el método más fácil y limpio para el tiempo transcurrido en el humano que encontré fue el Bonito tiempo biblioteca.
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 úselo con cuidado y en proyectos no amenazantes de vida.
JP
Puede hacer esto con una información period 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))
(Consejo de sombrero para esta respuesta En una pregunta similar, estoy publicando de forma cruzada)
Hay una pequeña clase de ayudante llamada Humant con lo que estoy bastante feliz.