Comment calculer le temps écoulé à partir de maintenant avec Joda-Time?

Je dois calculer le temps écoulé depuis une date spécifique jusqu’à maintenant et l’afficher au même format que les questions StackOverflow, à savoir:

15s ago 2min ago 2hours ago 2days ago 25th Dec 08 

Savez-vous comment y parvenir avec la bibliothèque Java Joda-Time ? Existe-t-il une méthode d’assistance qui l’implémente déjà ou devrais-je écrire l’algorithme moi-même?

Pour calculer le temps écoulé avec JodaTime, utilisez Period . Pour formater le temps écoulé dans la représentation humaine souhaitée, utilisez PeriodFormatter que vous pouvez créer avec PeriodFormatterBuilder .

Voici un exemple de coup d’envoi:

 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(); Ssortingng elapsed = formatter.print(period); System.out.println(elapsed); 

Ceci imprime maintenant

 Il y a 3 secondes
 Il y a 51 minutes
 Il y a 7 heures
 il y a 6 jours
 il y a 10 mois
 Il y a 31 ans

(Toux, vieux, toux) Vous voyez que j’ai aussi pris des mois et des années et que je l’ai configuré pour omettre les valeurs quand elles sont nulles.

Utilisez PrettyTime pour Simple Elapsed Time.

J’ai essayé HumanTime lorsque @sfussenegger a répondu et en utilisant Period de JodaTime mais la méthode la plus simple et la plus propre pour le temps écoulé lisible par l’homme que j’ai trouvé était la bibliothèque PrettyTime .

Voici quelques exemples simples avec des entrées et des sorties:

Il y a cinq minutes

 DateTime fiveMinutesAgo = DateTime.now().minusMinutes( 5 ); new PrettyTime().format( fiveMinutesAgo.toDate() ); // Outputs: "5 minutes ago" 

Il y a un moment

 DateTime birthday = new DateTime(1978, 3, 26, 12, 35, 0, 0); new PrettyTime().format( birthday.toDate() ); // Outputs: "4 decades ago" 

MISE EN GARDE: J’ai essayé de jouer avec les fonctionnalités plus précises de la bibliothèque, mais cela produit des résultats étranges, donc utilisez-les avec précaution.

JP

Vous pouvez le faire avec un PeriodFormatter, mais vous n’avez pas à faire l’effort de créer votre propre PeriodFormatBuilder comme dans d’ autres réponses . Si cela convient à votre cas, vous pouvez simplement utiliser le formateur par défaut:

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

(chapeau à cette réponse sur une question similaire, je croise pour la découverte)

Il y a une petite classe d’assistance appelée HumanTime avec laquelle je suis assez content.