web-dev-qa-db-fra.com

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 avec le 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? Is existe-t-il une méthode d'aide qui l'implémente déjà, ou dois-je écrire l'algorithme moi-même?

68
fabien7474

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 par PeriodFormatterBuilder .

Voici un exemple de lancement:

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);

Cela 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 également pris en compte des mois et des années et l'ai configuré pour omettre les valeurs lorsque celles-ci sont nulles.

113
BalusC

Utilisez PrettyTime pour le temps écoulé simple.

J'ai essayé HumanTime comme @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 le PrettyTime = bibliothèque.

Voici quelques exemples simples avec entrée et sortie:

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"

ATTENTION: J'ai essayé de jouer avec les fonctionnalités plus précises de la bibliothèque, mais cela produit des résultats bizarres alors utilisez-le avec précaution et projets ne mettant pas la vie en danger.

JP

19
Joshua Pinter

Vous pouvez le faire avec un PeriodFormatter mais vous n'avez pas à faire l'effort de créer votre propre PeriodFormatBuilder comme dans 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))

(pointe du chapeau à cette réponse sur une question similaire, je fais une publication croisée pour la découvrabilité)

10
snappieT

Il y a une petite classe d'aide appelée HumanTime dont je suis assez content.

7
sfussenegger