Quel est le meilleur moyen de manipuler les dates et les horodatages en Java?

StackOverflow https://stackoverflow.com/questions/87676

  •  01-07-2019
  •  | 
  •  

Question

Chaque fois que j’ai besoin de travailler avec des date et / ou des horodatages en Java, j’ai toujours l’impression de faire quelque chose de mal et de passer des heures sans fin à essayer de trouver un meilleur moyen de travailler avec les API sans devoir coder mes propres Date et Date. Cours d'utilité du temps. Voici quelques problèmes que je viens de rencontrer:

  • mois basés sur 0. Je me rends compte que la meilleure pratique consiste à utiliser Calendar.SEPTEMBER au lieu de 8, mais il est contrariant que 8 représente Septembre et non Août.

  • Obtenir une date sans horodatage. J'ai toujours besoin de l'utilitaire qui supprime la partie d'horodatage de la date par zéros.

  • Je sais que j'ai eu d'autres problèmes par le passé, mais je ne m'en souviens pas. N'hésitez pas à en ajouter d'autres dans vos réponses.

Ma question est donc la suivante: Quelles API tierces utilisez-vous pour simplifier l'utilisation de Java de la manipulation de la date et de l'heure, le cas échéant? Des réflexions sur l'utilisation de Joda ? Quelqu'un a regardé de plus près l'API JSR-310 Date et heure?

Était-ce utile?

La solution

Ce message a une bonne discussion sur la comparaison de l’API Date / Heure Java avec JODA.

Personnellement, je viens d'utiliser le calendrier grégorien et SimpleDateFormat à tout moment manipuler les dates / heures en Java. L’utilisation de l’API Java n’a jamais vraiment posé de problème et j’ai trouvé cela assez facile à utiliser. Je n’ai donc pas vraiment cherché d’autres solutions.

Autres conseils

java.time

Java 8 et les versions ultérieures incluent désormais les Cadre java.time . Inspiré de Joda-Time , défini par JSR 310 , étendu par le Projet ThreeTen-Extra . Voir le didacticiel .

Ce framework supplante les anciennes classes java.util.Date/.Calendar. Les méthodes de conversion vous permettent d’effectuer des conversions avec d’anciens codes non encore mis à jour pour les types java.time.

Les classes principales sont les suivantes:

Ce cadre résout les deux problèmes que vous avez énumérés.

mois basés sur 0

Les numéros de mois sont compris entre 1 et 12 dans java.time.

Encore mieux, un Enum < ( Mois ) fournit une instance d'objet pour chaque mois de l'année. Donc, vous ne devez pas dépendre de "magique". numéros dans votre code comme 9 ou 10 .

if ( theMonth.equals ( Month.OCTOBER ) ) {  …

En outre, cette énumération inclut des méthodes utilitaires pratiques, telles que l’obtention du nom localisé d’un mois.

Si vous ne connaissez pas encore les énumérations Java, lisez le Didacticiel

Une date sans heure

Le LocalDate La classe représente une valeur de date uniquement, sans heure de la journée, sans fuseau horaire.

LocalDate localDate = LocalDate.parse( "2015-01-02" );

Notez que la détermination d'une date nécessite un fuseau horaire. Un nouveau jour se lève plus tôt à Paris qu’à Montréal, où il est toujours hier. ZoneId classe représente un fuseau horaire.

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );

De même, il existe un LocalTime pour une heure qui n'est pas encore liée à une date ou à un fuseau horaire.

À propos de java.time

Le java.time Le framework est intégré à Java 8 et supérieur. Ces classes supplantent les anciennes classes de date-heure héritées , telles que java.util.Date , Agenda , & amp ; SimpleDateFormat .

Le projet Joda-Time , maintenant dans mode maintenance , conseille la migration vers le classes java.time .

Pour en savoir plus, consultez le Didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Où obtenir les classes java.time?

Le projet ThreeTen-Extra étend le java.time avec des cours supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts à java.time. Vous pouvez trouver ici des classes utiles telles que Intervalle , YearWeek , < code> YearQuarter , et plus .

Le projet Apache Commons Lang comporte une classe DateUtils qui effectue des opérations sur les dates utiles.

J'utilise beaucoup DateUtils.truncate () , ce qui "nous mettra à zéro" des parties de la date pour vous (utile si vous souhaitez que votre objet Date représente, par exemple, une date et n'inclue aucune information temporelle). Chaque méthode fonctionne aussi bien avec les objets Date et Agenda .

http://commons.apache.org/lang/

Je me sers exclusivement de Joda depuis trois ans maintenant et je le recommande sans hésitation. Toute la zone est recouverte d’une interface «qui fait ce qu’elle dit».

Joda peut sembler complexe au début. Par exemple, elle présente des concepts de période, de durée et d’intervalle similaires, mais vous pouvez commencer simplement en substituant org.joda.time.DateTime (ou org.joda.time.DateMidnight ) pour java.util.Date dans votre code, et vous en tenir aux nombreuses méthodes utiles que ces classes contiennent avant de comprendre l'autre zones.

J'utilise GregorianCalendar - toujours et partout. Java.util.Date est trop complexe, oui.

Mon conseil est donc: utilisez GC, c'est simple

C'est la même chose en javascript. Quelqu'un a dû fumer quelque chose quand il pense que ce serait une bonne idée de laisser 2008 signifier 2008, 31 pour désigner le 31ème jour du mois et - c’est la meilleure partie - 11 pour signifier le 12ème mois.

D'autre part, ils ont eu raison sur deux sur trois.

La chose qui me procure toujours avec Java est la bibliothèque date / heure. Je n’ai jamais utilisé Joda, regardez-le brièvement, c’est une bonne implémentation, et si je comprends bien JSR-130, c’est sa connaissance de Joda qui a finalement été incluse dans JavaSE.

Très souvent, lors de projets antérieurs, j'ai enveloppé les objets de date / heure Java, ce qui en soi était une tâche ardue. Puis utilisé les wrappers pour la manipulation de la date.

Les API de date sont très difficiles à concevoir, surtout si elles doivent gérer la localisation. Essayez de rouler le vôtre et voyez, cela vaut la peine de le faire au moins une fois. Le fait que Joda ait pu faire un si bon travail est un véritable atout pour ses développeurs. Pour répondre à votre question, je n’ai entendu que de bonnes choses à propos de cette bibliothèque, bien que je n’aie jamais joué avec elle-même.

Beaucoup de programmeurs commencent par utiliser Date, qui contient de nombreux constructeurs surchargés obsolètes (ce qui le rend difficile à utiliser), mais une fois que vous avez compris GregorianCalendar, il devient un peu plus facile à gérer. L'exemple ici est très utile:

http: //java.sun .com / j2se / 1.4.2 / docs / api / java / util / GregorianCalendar.html

Il est très simple d'écrire votre propre API de date, qui se trouve au-dessus des classes Java brutes, Date et Calendrier. Fondamentalement, la date et le calendrier souffrent du fait qu’ils essaient de regrouper deux concepts dans une même classe:

  1. Date (Année, Mois, Jour)
  2. Instantané (c'est-à-dire currentTimeMillis)

Si vous comprenez cela, cela va révolutionner la façon dont vous gérez les concepts de type date dans votre code. Les choses seront plus simples, plus claires, meilleures. Dans tous les sens!

Pour moi, Joda est trop compliqué, du moins pour la très grande majorité des cas, et je n’aime pas particulièrement le fait qu’ils se soient opposés aux formulaires Java standard, par exemple comment ils analysent et mettent en forme les dates. Stephen Colebourne, le responsable de JODA, est le responsable technique de JSR-310, qui souffre des mêmes problèmes à mon humble avis (j'ai suivi les discussions et contribué aux discussions au cours des dernières années).

Faites-le vous-même; c'est facile. Complétez simplement les classes suivantes: MyDate (enveloppant année-mois-jour), Mois (une énumération), TimeOfDay (heure-minute-sec-millis), DayOfWeek (énumération), Instant (enveloppant une longue). Tenez toujours compte des fuseaux horaires lors de la conversion d'instants et de dates.

Si cela semble décourageant, vous pouvez utiliser Calendar et SimpleDateFormat sous le capot. Vous le ferez en une journée et vous ne le regretterez jamais.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top