Très souvent, je rencontre des commentaires négatifs sur Java Date
et d'autres classes liées à la date-heure. En tant que développeur .NET, je ne peux pas pleinement (sans les avoir utilisés) comprendre ce qui ne va pas avec eux.
Quelqu'un peut-il faire la lumière là-dessus?
Réponses:
Ah, la
Date
classe Java . Peut-être l'un des meilleurs exemples de la façon de ne pas faire quelque chose dans aucune langue, n'importe où. Par où je commence?La lecture de JavaDoc peut amener à penser que les développeurs ont en fait de bonnes idées. Il parle longuement de la différence entre UTC et GMT , malgré le fait que la différence entre les deux est essentiellement des secondes intercalaires (ce qui se produit assez rarement ).
Cependant, les décisions de conception gaspillent vraiment l'idée d'être une API bien conçue. Voici quelques-unes des erreurs préférées:
null
. En conséquence, nous avons 0..11 (et aujourd'hui le 11ème mois de l'année 109). Il y a un nombre similaire de ++ et - sur les mois pour convertir en chaîne.Calendar
, conçu pour «réparer» cela, fait en fait les mêmes erreurs. Ils sont toujours mutables.Date
représente aDateTime
, mais pour s'en remettre à ceux de SQL land, il existe une autre sousjava.sql.Date
- classe , qui représente un seul jour (mais sans fuseau horaire associé).TimeZone
s associé à aDate
, et donc les plages (comme une `` journée entière '') sont souvent représentées comme minuit-minuit (souvent dans un fuseau horaire arbitraire)Enfin, il convient de noter que les secondes intercalaires se corrigent généralement par rapport à une bonne horloge système qui est mise à jour avec ntp en une heure (voir les liens ci-dessous). La chance qu'un système soit toujours opérationnel lors de l'introduction de deux secondes intercalaires (tous les six mois au minimum, pratiquement toutes les quelques années) est assez improbable, surtout compte tenu du fait que vous devez redéployer de temps en temps de nouvelles versions de votre code . Même l'utilisation d'un langage dynamique qui régénère les classes ou quelque chose comme un moteur WAR polluera l'espace de classe et finira par manquer de permgen.
la source
JSR 310 , qui a supplanté les anciennes classes date-heure avec java.time dans Java 8, se justifie dans le JSR d'origine comme suit:
la source
getMonth()
est basé sur zéro,getYear()
est basé sur 1900 (c'est-à-dire que l'année 2009 est représentée par 109).Date
classe.la source
Je ressens pour vous ... en tant qu'ancien programmeur .NET, j'ai posé les mêmes questions, l'API de temps en .NET (délais, surcharge d'opérateurs) est très pratique.
Tout d'abord, pour créer une date spécifique, vous utilisez soit une API obsolète, soit:
Pour soustraire un jour, vous faites des choses mauvaises comme
ou pire
Pour savoir combien de temps s'est écoulé entre deux dates (en jours / semaines / mois) ... c'est encore pire
Cependant, DateUtils d'apache (
org.apache.commons.lang.time.DateUtils
) offre des méthodes pratiques et je me suis retrouvé à les utiliser uniquement ces derniers tempsComme l'a écrit Brabster, Joda Time est aussi une bonne bibliothèque externe, mais Apache semble plus "commun" qu'autre chose ...
la source
Period
etDuration
classes pour calculer et représenter le temps écoulé sur une échelle d'années-mois-jours et heures-minutes-secondes respectivement.Je trouve que l'API Date de Java est utilisable, pour être honnête. La plupart des questions que j'ai vu et entendu à propos se rapportent à la verbosité, la nécessité d'impliquer plusieurs classes pour faire quelque chose d' utile (
Calendar
,Date
,DateFormat
/SimpleDateFormat
) et le manque de accesseurs simples commegetDayOfWeek()
.Joda Time est une API alternative très respectée en Java, et dans la section Why Joda Time, elle donne quelques arguments supplémentaires pour expliquer pourquoi c'est une alternative viable qui pourrait être intéressante.
la source