103 votes

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

Je suis en train de créer 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 celui des dates et des heures.

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

131voto

Jon Skeet Points 692016

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

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

Pour :

  • Cela fonctionne, très bien. Je soupçonne fortement qu'il y a beaucoup moins de bogues dans Joda que dans les bibliothèques Java standard. Certains des bogues des bibliothèques Java sont vraiment difficiles (voire impossibles) à corriger en raison de leur conception.
  • Il est conçu pour vous encourager à penser à la manipulation de la date et de l'heure de la bonne manière, en séparant le concept d'une "heure locale" (par exemple, "réveillez-moi à 7 heures, où que je sois") et d'un instant dans le temps ("j'appelle James à 15 heures PST ; il n'est peut-être pas 15 heures 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, qui fait changent relativement fréquemment
  • Il a une bonne histoire d'immutabilité, ce qui rend la vie une lot plus facile IME.
  • Dans le prolongement de l'immuabilité, tous les formateurs sont à l'abri des threads, ce qui est très bien car on peut presque toujours vous voulez réutiliser un seul formateur à travers l'application
  • Vous aurez une longueur d'avance sur l'apprentissage. java.time en Java 8, car ils sont au moins un peu similaires

Cons :

  • Il s'agit d'une autre API à apprendre (bien que la documentation soit assez bonne).
  • C'est une autre bibliothèque pour construire et déployer.
  • Si vous utilisez Java 8, il y a encore du travail à faire pour migrer vos compétences.
  • J'ai omis d'utiliser le DateTimeZoneBuilder efficacement dans le passé. Il s'agit d'un très Un cas d'utilisation rare cependant.

Pour répondre à l'idée d'oxbow_lakes de construire 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 faire du travail quand il a déjà été fait pour vous ?
  • Un nouveau venu dans votre équipe a beaucoup plus de chances d'être familiarisé avec Joda qu'avec votre API maison.
  • Vous risquez de vous tromper pour tout ce qui est au-delà des utilisations les plus simples... et même si vous commencez par pensez à vous n'avez besoin que de fonctionnalités simples, ces choses ont l'habitude de se compliquer, un petit peu à la fois. La manipulation de la date et de l'heure est dur à faire correctement. De plus, les API Java intégrées sont difficiles à utiliser. utiliser Il suffit de regarder les règles de fonctionnement de l'arithmétique date/heure de l'API calendrier. Construire quoi que ce soit par-dessus ces règles est une mauvaise idée plutôt que d'utiliser une bibliothèque bien conçue pour commencer.

19voto

gizmo Points 8528

Eh bien, à moins que vous 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 un gain de temps et cela évite bien des maux de tête.

12voto

oxbow_lakes Points 70013

La réponse est : cela dépend

JODA (et JSR-310) est une bibliothèque de date et d'heure entièrement fonctionnelle, qui prend en charge l'utilisation de plusieurs systèmes de calendrier.

Personnellement, j'ai trouvé que JODA allait un peu trop loin en termes de complexité pour ce dont j'ai besoin. Les 2 principales erreurs (IMHO) dans le standard java Date et Calendar Les classes sont :

  1. Ils sont mutables
  2. Ils confondent le concept de l'année, du mois et du jour avec celui de l'instant.

Bien que ces questions soient traitées par JODA, vous trouverez qu'il est assez facile de créer vos propres classes pour les éléments suivants YearMonthDay et Instant qui utilisent tous les deux les classes Java sous le capot pour les calculs "calendaires" réels. Vous n'avez donc pas à vous familiariser avec une API de plus de 100 classes, un mécanisme de formatage/parsage 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 pour vous. Si ce n'est pas le cas, je vous suggère de créer votre propre système.

Le responsable de la spécification JSR-310 est Stephen Colebourne, qui a écrit JODA en premier lieu. remplacer JODA.

5voto

Anthony Roy Points 605

Tout dépend de ce que vous faites avec les dates. Si vous ne faites que les conserver, les dates intégrées à Java feront probablement tout ce que vous voulez. Cependant, si vous effectuez des manipulations étendues de l'heure et de la date, il est probablement préférable d'utiliser Joda.

1voto

Lukas Eder Points 48046

Si vous n'avez pas besoin de toutes les fonctionnalités supplémentaires de Joda, vous pouvez également essayer une bibliothèque tierce plus simple comme http://sourceforge.net/projects/joocal . Il fournit une abstraction très basique des objets Date et Calendrier de Java. Exemples :

// Get the day three days before my birthday
java.sql.Timestamp ts = new Day("10.07.1981").getPrevious(3).getSQLTimestamp();

// Use periods and compare them
// Get a period spanning the next five years (2010-2015)
Period<Year> nextCoupleOfYears = new Year("2010").getPeriod(5);
if (nextCoupleOfYears.contains(new Day(ts)) {
  // Do stuff...
}

Ainsi, vous pouvez effectuer toutes sortes de manipulations tout en utilisant les objets de Java pour la persistance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X