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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top