Quelle est la meilleure façon de manipuler les dates et les horodatages en Java?
Chaque fois que j'ai besoin de travailler avec la date et/ou timstamps en Java, j'ai toujours l'impression que je suis en train de faire quelque chose de mal et de passer d'innombrables heures à essayer de trouver une meilleure façon de travailler avec l'Api sans avoir à coder mon propre Date et l'Heure de l'utilitaire de classes. Voici un couple de choses ennuyeuses, je viens de tomber sur:
- Basée sur 0 mois. Je me rends compte que la meilleure pratique consiste à utiliser le Calendrier.SEPTEMBRE au lieu de 8, mais il est ennuyeux que 8 représente septembre et non pas le mois d'août.
- L'obtention d'une date, sans un horodatage. J'ai toujours besoin de l'utilitaire que des Zéros le timestamp partie de la date.
- Je sais qu'il y a d'autres problèmes que j'ai eu dans le passé, mais ne peux pas me rappeler. N'hésitez pas à ajouter de plus dans vos réponses.
Donc, ma question est ... Qu'tiers Api utilisez-vous pour simplifier la Java de l'utilisation de la Date et de l'Heure de manipulation, le cas échéant? Toute réflexion sur l'utilisation de Joda? Quelqu'un a regardé de plus près JSR 310 Date et l'Heure de l'API?
source d'informationauteur Joe Dean
Vous devez vous connecter pour publier un commentaire.
Ce post a une bonne discussion sur la comparaison de la Java Date/Heure API vs JODA.
Personnellement, je vient de l'utilisation Calendrier Grégorien et SimpleDateFormat tout moment, j'ai besoin de manipuler des dates/heures en Java. Je n'ai jamais vraiment eu de problèmes dans l'utilisation de l'API Java et trouvent qu'il est assez facile à utiliser, donc n'ont pas vraiment regardé dans les solutions de rechange.
java.temps
Java 8 et, plus tard, inclut désormais la java.le temps cadre. Inspiré par Joda-Timedéfini par JSR 310prolongée par la ThreeTen-Extra projet. Voir le Tutoriel.
Ce cadre supplante l'ancienne java.util.Date/.Calendrier des classes. Méthodes de Conversion permettant de convertir en arrière et en avant de travailler avec l'ancien code pas encore mis à jour pour java.les types d'heures.
Les classes de base sont:
Instantané
Un moment sur le scénario, toujours dans UTC.
ZoneId
Un fuseau horaire. La sous-classe
Écartfuseau
comprend une constante pour l'UTC.ZonedDateTime
=Instant
+ZoneId
Représente un moment sur le scénario ajusté dans un fuseau horaire spécifique.
Ce cadre résout les deux problèmes que vous avez énumérés.
Basée sur 0 mois
Mois sont les numéros de 1 à 12 en java.temps.
Encore mieux, un
Enum
(Mois
) fournit une instance de l'objet pour chaque mois de l'année. Si vous avez besoin dépend pas de la "magie" des nombres dans votre code comme9
ou10
.En outre, que l'enum comprend certains utilitaire pratique des méthodes telles que l'obtention d'un mois est localisé nom.
Si pas encore familier avec Java enums, lire la Tutoriel et d'étude. Ils sont étonnamment maniable et puissant.
Une date, sans un temps
La
LocalDate
classe représente une date seule valeur, sans le temps de la journée, sans avoir le temps de la zone.Noter que la détermination d'une date nécessite un temps de traitement de la zone. Un nouveau jour se lève plus tôt à Paris qu'à Montréal où il est encore "hier". Le
ZoneId
classe représente un fuseau horaire.De même, il y a un
LocalTime
classe pour un temps de la journée pas encore attaché à une date ou de l'heure de la zone.Sur java.temps
La java.le temps cadre est intégré dans Java 8 et les versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date du temps des classes comme
java.util.Date
Agenda
&SimpleDateFormat
.La Joda-Time projet, maintenant dans le mode de maintenanceconseille la migration vers le java.le temps classes.
Pour en savoir plus, consultez les Oracle Tutoriel. Et de recherche de Débordement de Pile pour de nombreux exemples et des explications. La spécification est JSR 310.
Où obtenir le java.les classes de temps?
La ThreeTen-Extra projet s'étend java.temps avec d'autres classes. Ce projet est un terrain d'essai pour de possibles futurs ajouts à java.temps. Vous pouvez trouver quelques classes utiles ici comme
Intervalle
YearWeek
YearQuarter
et plus.Apache Commons Lang projet a un
DateUtils
classe qui effectue utile de la Date des opérations.- Je utiliser
DateUtils.truncate()
beaucoup, qui va "remettre à zéro" les parties de la Date pour vous (utile si vous voulez que votre objet Date à, dire, représenter une date et incluent pas toute l'information en temps). Chaque méthode fonctionne pour les deuxDate
etCalendar
objets trop.http://commons.apache.org/lang/
J'ai été en utilisant Joda exclusivement depuis maintenant trois ans et serait certainement vous le conseille, c'est l'ensemble de la zone couverte avec une interface qui "fait ce qu'il dit".
Joda peut paraître complexe lorsque vous commencez, comme par exemple il a des notions de périodes, la durée et les intervalles qui regardent un peu similaire, mais vous pouvez commencer tout simplement par la substitution
org.joda.time.DateTime
(ouorg.joda.time.DateMidnight
) pourjava.util.Date
dans votre code, et coller avec de la de nombreuses méthodes utiles que ces classes contiennent, avant de comprendre les autres domaines.Im en utilisant GregorianCalendar - toujours et partout. Java Simple.util.La Date est trop complexe, ouais.
Donc, mon conseil est d'utiliser GC, sa simple
C'est la même chose en javascript. Quelqu'un doit avoir été de fumer quelque chose quand ils pensent que c'est une bonne idée de laisser 2008 moyenne de l'année 2008, 31 à dire le 31e jour du mois, et - c'est la meilleure partie - 11 à dire le 12ème mois.
D'autre part, ils ont obtenu le droit à deux des trois.
La chose qui me surprend toujours avec Java est la date de la bibliothèque. Je n'ai jamais utilisé de Joda, juste brièvement la regardez, il donne l'impression d'être une assez bonne mise en œuvre, et si je comprends JSR-130 correctement sa prise de connaissance de Joda et finalement de l'avoir inclus dans JavaSE.
Assez souvent pour les projets passés, j'ai enveloppé le Java date du temps des objets, ce qui en soi est tout à fait une tâche. Ensuite utilisé l'emballage de la date de la manipulation.
Date Api sont très difficiles à concevoir, surtout si elles ont à traiter avec la localisation. Essayez de rouler et de voir, il vaut la peine de faire au moins une fois. Le fait que Joda a été en mesure de faire un bon travail est un réel crédit à la ses développeurs. Pour répondre à votre question, j'ai entendu parler de rien, mais de bonnes choses à propos de cette bibliothèque, mais je n'ai jamais joué avec moi-même.
Beaucoup de programmeurs de commencer par utiliser la Date, qui a de nombreuses obsolète constructeurs surchargés (ce qui la rend difficile à utiliser), mais une fois que vous comprendre 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
C'est vraiment simple à écrire votre propre date de l'API qui est assis sur le dessus de la crue des classes Java, la Date et le Calendrier. Fondamentalement, la date et le Calendrier souffrent du fait qu'ils essaient de caser deux concepts dans une même classe:
Quand vous comprenez cela, il suffit de révolutionner la façon dont vous gérer date-comme les concepts dans votre code. Les choses seront plus simples, plus claires, mieux. Dans tous les sens!
Pour moi, Joda est de plus en plus compliqué, au moins pour l'immense majorité des buts et je n'aime pas particulièrement le fait qu'ils sont allés à l'encontre de la norme Java formes, par exemple la façon dont ils analyser et mettre en forme des dates. Stephen Colebourne, le gars derrière JODA, est le spec lead de la JSR-310 et cette souffre du même problème à mon humble avis (je l'ai suivie et ont contribué aux discussions pour les dernières années).
Faire vous-même; c'est facile. Il suffit de remplir les classes suivantes: Madate (emballage année-mois-jour), Mois (enum), TimeOfDay (heure-min-sec-millis), DayOfWeek (enum), l'Instant (l'enveloppant d'un long). Toujours considérer les zones lors de la conversion entre les Instants et les Dates.
Si cela semble ardue, vous pouvez utiliser le Calendrier et SimpleDateFormat sous le capot. Vous pouvez faire cela en une journée et de ne jamais le regretter.