Dois-je utiliser des classes de date et d'heure Java ou utiliser une bibliothèque tierce comme Joda Time?

147

Je crée un système basé sur le Web qui sera utilisé dans des pays du monde entier. Un type de données qui doit être stocké est les dates et les heures.

Quels sont les avantages et les inconvénients de l'utilisation des classes de date et d'heure Java par rapport aux bibliothèques tierces telles que Joda time ? Je suppose que ces bibliothèques tierces existent pour une bonne raison, mais je ne les ai jamais vraiment comparées moi-même.

JodaStephen
la source
5
Pour clarifier quelques commentaires… Alors que Joda-Time continue, son successeur JSR 310: Date and Time API est en effet prévu pour faire partie de Java 8 sous le package java.time . Oracle a un brouillon d'un tutoriel . JDBC 4.2 gérera les nouveaux types de données.
Basil Bourque

Réponses:

197

EDIT: Maintenant que Java 8 est sorti, si vous pouvez l'utiliser, faites-le! java.timeest encore plus propre que Joda Time, à mon avis. Cependant, si vous êtes bloqué avant Java-8, lisez la suite ...

Max a demandé les avantages et les inconvénients de l'utilisation de Joda ...

Avantages:

  • Il fonctionne très bien. Je soupçonne fortement qu'il y a beaucoup moins de bogues dans Joda que les bibliothèques Java standard. Certains des bogues dans les bibliothèques Java sont vraiment difficiles (voire impossibles) à corriger en raison de la conception.
  • Il est conçu pour vous encourager à réfléchir à la gestion de la date / heure de la bonne manière - en séparant le concept d'une "heure locale" (par exemple, "réveillez-moi à 7 heures du matin où que je sois") et d'un instant dans le temps ("j'appelle James à 15h PST; il n'est peut-être pas 15h là où il se trouve, mais c'est le même instant ")
  • Je pense que cela facilite la mise à jour de la base de données des fuseaux horaires, ce qui changement relativement fréquemment
  • Il a une bonne histoire d'immuabilité, ce qui rend la vie beaucoup plus facile IME.
  • Diriger à partir immuabilité, tous les formatteurs sont thread-safe, ce qui est grand parce que vous avez presque toujours souhaitez réutiliser un seul formateur via l'application
  • Vous aurez une longueur d'avance sur l'apprentissage java.timede Java 8, car ils sont au moins un peu similaires

Les inconvénients:

  • C'est une autre API à apprendre (bien que les documents soient plutôt bons)
  • C'est une autre bibliothèque sur laquelle construire et déployer
  • Lorsque vous utilisez Java 8, il reste du travail pour migrer vos compétences
  • Je n'ai pas réussi à utiliser DateTimeZoneBuilderefficacement dans le passé. C'est cependant un cas d'utilisation très rare.

Pour répondre à l'idée d'oxbow_lakes de créer efficacement votre propre petite API, voici mon point de vue sur les raisons pour lesquelles c'est une mauvaise idée:

  • C'est du travail. Pourquoi travailler alors que c'est déjà fait pour vous?
  • Un nouveau venu dans votre équipe est beaucoup plus susceptible de se familiariser avec Joda qu'avec votre API locale
  • Vous risquez de vous tromper pour tout ce qui va au-delà des utilisations les plus simples ... et même si vous pensez au départ que vous n'avez besoin que de fonctionnalités simples, ces choses ont l'habitude de devenir plus compliquées, un petit peu à la fois. La manipulation de la date et de l'heure est difficile à faire correctement. De plus, les API Java intégrées sont difficiles à utiliser correctement - il suffit de regarder les règles pour le fonctionnement de l'arithmétique date / heure de l'API de calendrier. Construire quoi que ce soit par dessus est une mauvaise idée plutôt que d'utiliser une bibliothèque bien conçue pour commencer.
Jon Skeet
la source
5
@adi: Mis à jour - il est toujours valide, mais j'espère que JSR-310 fera partie de Java 8, mais il ne faisait pas partie de Java 7.
Jon Skeet
2
@JonSkeet Cela devrait probablement être mis à jour depuis l'introduction de java-8
Sionnach733
@ Sionnach733: Je ne vais pas tout mettre à jour, mais j'ajouterai quelque chose au début.
Jon Skeet
2
Il y a un rétroportage java.time.*pour Java 6 et 7: threeten.org/threetenbp
Miscreant
24

Eh bien, à moins que vous n'ayez l'intention d'attendre Java 8, en espérant qu'ils implémenteront une meilleure API pour manipuler la date et l'heure, oui, s'il vous plaît, utilisez Joda-Time . C'est gagner du temps et éviter de nombreux maux de tête.

gadget
la source
Avantages et inconvénients? Je n'ai jamais utilisé le temps Joda - ce serait intéressant d'entendre ce que les gens aiment à ce sujet.
Max Stewart
15

La réponse est: ça dépend

JODA (et JSR-310) est une bibliothèque de date / heure entièrement fonctionnelle, comprenant une prise en charge pour une utilisation avec plusieurs systèmes de calendrier.

Personnellement, j'ai trouvé que JODA était un pas trop loin en termes de complexité pour ce dont j'ai besoin. Les 2 erreurs principales (IMHO) dans le java standard Dateet les Calendarclasses sont:

  1. Ils sont mutables
  2. Ils mélangent le concept d'une année-mois-jour à partir d'un instantané

Bien que ceux-ci soient traités par JODA, vous trouverez qu'il est assez facile de lancer vos propres classes pour YearMonthDayet Instant, qui utilisent toutes les deux les classes Java sous le capot pour des calculs "calendaires" réels. Ensuite, vous n'avez pas à vous familiariser avec une API de> 100 classes, un mécanisme de formatage / d'analyse différent, etc.

Bien sûr, si vous avez besoin d'une représentation complète de différentes chronologies (par exemple l'hébreu) ​​ou si vous souhaitez être en mesure de définir votre propre système de calendrier imaginaire (par exemple pour un jeu que vous écrivez), alors peut-être que JODA ou JRS-310 est fait pour vous. Sinon, je dirais que rouler le vôtre est peut-être la voie à suivre.

Le responsable de la spécification JSR-310 est Stephen Colebourne qui a écrit JODA à la 1ère place, remplaçant donc logiquement JODA.

oxbow_lakes
la source
16
ne doit pas être réinventé par des non-spécialistes, l'OMI.
Jon Skeet
6
Je ne suis pas un crétin non plus, mais j'ai toujours eu des problèmes avec les API Java D&T. Ils sont extrêmement faciles à utiliser à mauvais escient. La raison pour laquelle les gens sont plus susceptibles de pouvoir utiliser Joda correctement est que Joda est mieux conçu - cela vous encourage à faire la bonne chose.
Jon Skeet le
6
Je fais confiance à un expert sur moi-même n'importe quel jour de la semaine en ce qui concerne les API de date / heure. Ce n'est pas comme s'il s'agissait d'une API tierce aléatoire sans que personne d'autre ne l'utilise. L'argument "> 100 classes" est un homme de paille, car vous n'avez évidemment pas besoin de tous les apprendre.
Jon Skeet
5
Je suppose que nous devrons accepter de différer. Toute date / heure de confiance écrite par des experts et bien conçue, ce qui m'évite d'avoir à faire du sale boulot avec le calcul du temps, compte comme un "must have" de mon point de vue. Au cours de la dernière année, j'ai appris à détester la mesure du temps humain avec passion.
Jon Skeet
5
Rouler soi-même quand Joda existe est une idée tout simplement terrible. Ne fais pas ça. Il est vrai que Joda a des dizaines de classes que vous n'allez pas utiliser, mais la réponse est tout simplement: n'utilisez pas celles dont vous n'avez pas besoin. Il y a tellement de choses qui peuvent mal tourner avec l'écriture de votre propre bibliothèque de ce type - la quantité d'efforts que vous allez devoir déployer est énorme, à la fois en développement et en test. Ou, vous pouvez simplement ajouter une bibliothèque. Ensuite, Joda a l'avantage supplémentaire que les nouvelles recrues de votre équipe l'ont peut-être déjà utilisée, mais elles n'ont pas utilisé votre bibliothèque locale.
Dawood ibn Kareem le
7

Tout dépend de ce que vous faites avec les dates. Si vous les persistez simplement, les dates intégrées à Java feront probablement tout ce que vous voudrez. Cependant, si vous effectuez une manipulation étendue de la date et de l'heure, vous êtes probablement mieux avec Joda.

Anthony Roy
la source
7

Vous devez utiliser une bibliothèque Joda-Time, car:

  1. Joda-Time prend en charge la norme ISO 8601 , qui est un moyen standard de
    représentation de la date.
  2. Ajouter et soustraire un jour / mois / année est plus facile dans Joda-Time que java.util.date.
  3. Une initialisation par une date donnée est tellement plus facile dans Joda-Time.
  4. Joda-Time prend également en charge le fuseau horaire.
  5. Joda-Time a une meilleure analyse intégrée. Une date erronée telle que "2014-02-31" est générée comme une erreur:Exception in thread "main" org.joda.time.IllegalFieldValueException: Cannot parse "2014-02-31": Value 31 for dayOfMonth must be in the range [1,28].

Vous pouvez aimer cette page pour plus de détails: http://swcodes.blogspot.com/

Client
la source