web-dev-qa-db-fra.com

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

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 doivent être stockées sont 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 heure Joda ? Je suppose que ces bibliothèques tierces existent pour une bonne raison, mais je ne les ai jamais vraiment comparés moi-même.

146
user14070

EDIT: Maintenant que Java 8 a été publié, si vous pouvez l'utiliser, faites-le! Java.time est 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 standard Java. Certains des bogues dans les bibliothèques Java sont vraiment difficiles (sinon impossibles)) à fixer en raison de la conception.
  • Il est conçu pour vous encourager à réfléchir correctement à la gestion de la date et de l'heure - en séparant le concept d'une "heure locale" (par exemple "réveillez-moi à 7h où que je sois") et d'un instant dans le temps ("j'appelle James à 15 heures PST; il ne peut pas être 15 heures où il est, mais c'est le même instant ")
  • Je crois que cela facilite la mise à jour de la base de données de fuseau horaire, qui le fait change assez fréquemment
  • Il a une bonne histoire d'immuabilité, ce qui rend la vie un IME beaucoup plus facile.
  • En partant de l'immuabilité, tous les formateurs sont thread-safe, ce qui est génial car vous avez presque toujours souhaitez réutiliser un seul formateur via l'application
  • Vous aurez une longueur d'avance sur l'apprentissage Java.time in Java 8, car ils sont au moins quelque 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 pour construire et déployer
  • Lorsque vous utilisez Java 8, il reste encore du travail pour migrer vos compétences
  • Je n'ai pas réussi à utiliser le DateTimeZoneBuilder efficacement dans le passé. Il s'agit cependant d'un cas d'utilisation très rare.

Pour répondre à l'idée d'oxbow_lakes de construire efficacement votre propre petite API, voici mon point de vue sur la raison pour laquelle c'est une mauvaise idée:

  • C'est du travail. Pourquoi travaillez-vous alors que c'est déjà fait pour vous?
  • Un nouveau venu dans votre équipe est beaucoup plus susceptible de connaître Joda qu'avec votre API locale
  • Vous risquez de vous tromper pour quoi que ce soit au-delà des utilisations les plus simples ... et même si vous initialement - pensez vous n'avez besoin que de fonctionnalités simples, ces choses ont l'habitude de devenir plus compliquées, une toute petite peu à la fois. La manipulation de la date et de l'heure est difficile pour faire correctement. De plus, les Java Java sont difficiles à - utiliser correctement - il suffit de regarder les règles de 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.
196
Jon Skeet

Eh bien, sauf si vous avez l'intention d'attendre Java 8, en espérant qu'ils implémenteront ne meilleure API pour manipuler la date et l'heure, oui, veuillez utiliser Joda-Time . C'est un gain de temps et évite de nombreux maux de tête.

24
gizmo

La réponse est: cela dépend

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

Personnellement, j'ai trouvé que JODA allait trop loin en termes de complexité pour ce dont j'avais besoin. Les 2 erreurs principales (IMHO) dans les classes standard Java Date et Calendar 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 assez facile de rouler vos propres classes pour YearMonthDay et Instant, qui utilisent toutes les deux les classes Java Java sous le capot pour les calculs "calendriers" réels. Ensuite, vous n'avez pas à vous familiariser avec une API de> 100 classes, un mécanisme de formatage/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 souhaitez pouvoir 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 pour vous. Sinon, je dirais que rouler le vôtre est peut-être la voie à suivre.

Le responsable des spécifications JSR-310 est Stephen Colebourne qui a écrit JODA à la 1ère place, donc logiquement remplacer JODA.

15
oxbow_lakes

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 incorrecte comme "2014-02-31" est renvoyé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/

7
Guest

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 voulez. Cependant, si vous faites une manipulation approfondie de la date et de l'heure, vous êtes probablement mieux avec Joda.

7
Anthony Roy