Joda Time vs Java Time

19

Bien que Joda soit riche en fonctionnalités et plus sophistiqué que le temps Java standard, ce n'est pas toujours la meilleure chose à utiliser. Comment puis-je décider si je dois utiliser Joda Time ou Java Time dans un code Java?

Existe-t-il une sorte de directive qui nous indique comment choisir la bonne en fonction de nos besoins?

Chevalier Jedi
la source
5
Tirez le meilleur parti des deux mondes en utilisant la nouvelle API Date et heure incluse dans Java 8 . Il est fortement influencé par Joda Time. En fait, l'auteur principal est Stephen Colebourne, l'auteur de Joda Time.
Joachim Sauer
1
@JoachimSauer Est-il apparu dans une version finale ou cela se produira-t-il lorsque Java 8 sera lancé?
m3th0dman
@ m3th0dman: il sera inclus dans la version finale de Java 8, il n'est pas encore sorti. L'AG est actuellement prévue pour le 09/09/2013 .
Joachim Sauer
Joda-Time et les classes de date-heure Java originales sont désormais dépassées par les classes java.time intégrées à Java 8, Java 9 et versions ultérieures.
Basil Bourque

Réponses:

29

Joda Time est une telle amélioration par rapport à la bibliothèque de temps Java qu'il est presque toujours le bon choix, à l'exception des exceptions suivantes:

  1. Lorsqu'il est difficile ou indésirable d'ajouter des dépendances tierces à votre projet

  2. Lorsque son utilisation dans une interface publique entraînerait des problèmes, par exemple obtenir un ORM pour gérer à la fois les champs de temps java et Joda

Cependant, dans le cas de 2), il serait toujours préférable d'utiliser Joda en interne si possible.

Les choses ci-dessus méritent d'être gardées à l'esprit, mais devraient être rares. En cas de doute, rendez-vous avec Joda.

Robert Johnson
la source
Veuillez me dire ce que signifie "utiliser Joda en interne". Je suis débutant et je ne connais pas toutes ces choses.
Jedi Knight
5
@Jedi Knight: cela signifie que l'application utilise Joda pour sa propre logique et ne convertit vers / depuis java.util.Date que lorsqu'elle communique avec un système externe qui en a besoin.
Michael Borgwardt
2
Par «interne», il peut être interne à l'application dans son ensemble (comme dans l'exemple de Michael), mais il peut être interne à une classe ou simplement à une méthode particulière. Supposons par exemple que vous disposez d'une méthode utilitaire qui prend deux objets Java Date et calcule le nombre de jours ouvrables entre eux, mais elle contient un bogue. Pour résoudre ce problème, il peut très bien être plus facile de réécrire cette méthode à l'aide de JodaTime à la place, mais vous ne pourrez peut-être pas vous permettre de refactoriser tout le code qui appelle la méthode, donc vous ne modifiez pas la signature de la méthode. Dans ce cas, vous utilisez Joda "en interne" dans cette méthode.
Robert Johnson
Pour info, le projet Joda-Time est désormais en mode maintenance , l'équipe conseillant la migration vers les classes java.time . Voir Tutoriel par Oracle .
Basil Bourque
13

Notez que sur le site Web de Joda-Time, il est indiqué:

Les classes de date et d'heure standard avant Java SE 8 sont médiocres. En s'attaquant de front à ce problème, Joda-Time est devenu la bibliothèque standard de facto de date et d'heure pour Java. Notez qu'à partir de Java SE 8, les utilisateurs sont invités à migrer vers java.time (JSR-310).

Le principal contributeur de Joda-Time , jodastephen , est également le principal contributeur de JSR-310, comme on peut le voir sur le référentiel GitHub associé à http://www.threeten.org/ . Soit dit en passant, jodastephen a également une poignée SO ...

Je pense qu'il est sûr d'affirmer que nous pouvons nous sentir à l'aise et en sécurité avec la nouvelle API de date et d'heure fournie par Java 8 .

Quelques références supplémentaires:

Yo-yo
la source
12

L'API de date standard Java est si fondamentalement cassée que j'ai souvent envisagé d'ajouter simplement Joda Time aux extensions de bibliothèque de la JVM pour qu'elle se charge par défaut sur le chemin de classe avec le reste de l'API Java.

Si vous avez déjà été chargé de moderniser l'internationalisation et les fuseaux horaires dans une application Java héritée et que vous avez essayé d'utiliser l'API Java standard seul, vous comprendrez ce que je veux dire. J'ai pu transformer des milliers de lignes de code asinine en moins d'une centaine. L'augmentation de la productivité est inconcevable.

De plus, l'API Date standard n'est pas intuitive, où l'API Joda fluide peut être récupérée en heures et non en semaines. Votre analogie d'essayer d'arriver à l'île qui est à deux miles de distance, est plus semblable à ce qui suit.

1) Un bateau à moteur qui vous amènera sur l'île en seulement 6 minutes.

Ou...

2) Un radeau de bambou de fortune attaché avec des vignes lors d'un ouragan dirigé par un fou dont le meilleur ami est un volley-ball.

Comme d'autres réponses l'ont indiqué, les quelques inconvénients tels que l'ORM deviennent même inexistants car Hibernate a maintenant des plugins qui permettent aux propriétés de bean de type Joda d'être mappées aux champs de date / heure de la base de données. JPA pourrait également avoir une réponse à cela.

Si vous souhaitez que votre application ait une empreinte minimaliste en tant qu'application de bureau en ce qui concerne l'espace disque, Java n'est peut-être même pas le bon choix de langue.

maple_shaft
la source
Pour info, le projet Joda-Time est désormais en mode maintenance , l'équipe conseillant la migration vers les classes java.time . Voir Tutoriel par Oracle .
Basil Bourque
8

Un autre point: Java-Time (ie Date) n'est pas ThreadSafe mais JodaTime l'est. JodaTime est donc préférable lorsque des exigences telles que

  • Environnement multithread accédant aux ressources communes
  • Synchronisation temporelle centralisée comme les situations

Ou bien pour les applications simples, Java-Time est correct.

vintesh
la source
Même DateTime n'est pas non plus ThreadSafe, n'est-ce pas? Corrigez-moi si je me trompe.
vintesh
3
La grande majorité de la bibliothèque Joda, y compris la classe DateTime, est immuable et donc thread-safe. Cependant, il existe quelques classes mutables qui ne sont pas thread-safe. Voir joda-time.sourceforge.net/faq.html#threading .
Robert Johnson
1
La sécurité des threads java.timeest implémentée par l'immuabilité. Voir stackoverflow.com/questions/9303532/… . Cela fonctionne bien pour les applications simples et complexes. Même l' api doc déclare que "Toutes les classes sont immuables et thread-safe" (littéralement citées dans le deuxième paragraphe). Les anciennes java.utilclasses par contre ont plusieurs problèmes. Je me rends compte que cette réponse se réfère à ce dernier, mais important de faire cette distinction maintenant.
YoYo
Ne pas représenter les dates comme des valeurs immuables est tout simplement fou. Je sais que ça a été corrigé maintenant, mais à quoi pensaient-ils vraiment?
Aluan Haddad
2

Le framework java.time remplace à la fois les classes date-heure héritées et Joda-Time

Mise à jour: les anciennes classes de date et d'heure livrées avec les premières versions de Java sont désormais héritées, officiellement supplantées par les classes java.time intégrées à Java 8, Java 9 et versions ultérieures.

Date, Calendar, SimpleDateFormat, Et les java.sql.*cours de date-heure devraient tous être évités. Il n'est jamais nécessaire d'utiliser ces classes déroutantes, gênantes et mal conçues. Ils sont entièrement remplacés par des classes java.time. Leur seul but est maintenant de maintenir l'ancien code existant. Lors de l'interface avec l'ancien code, vous pouvez convertir vers / depuis java.time en appelant de nouvelles méthodes ajoutées aux anciennes classes. Pour plus d'informations sur la conversion, voir: Convertir java.util.Date en quel type "java.time"? .

Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time . Le projet Joda-Time a inspiré le framework java.time. Les deux sont dirigés par le même homme, Stephen Colebourne . Vous pouvez considérer java.time comme une réécriture / refonte de Joda-Time, tout nouveau code, mais utilisant ce qui a été appris au fil des ans depuis la construction de la première bibliothèque de date-heure complète et sophistiquée de l'industrie.

Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications.

Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport et adaptée à Android dans ThreeTenABP (voir Comment utiliser… ).

Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour de futurs ajouts possibles à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval, YearWeek, YearQuarteret plus .

Basil Bourque
la source