Je viens du monde C #, donc pas encore très expérimenté avec Java. Eclipse vient de me dire que Date
c'était obsolète:
Person p = new Person();
p.setDateOfBirth(new Date(1985, 1, 1));
Pourquoi? Et quoi (en particulier dans les cas comme ci-dessus) devrait être utilisé à la place?
java
date
deprecated
Svish
la source
la source
Réponses:
Le
Date
constructeur spécifique est obsolète etCalendar
doit être utilisé à la place. leJavaDoc
pour date décrit les constructeurs sont déconseillés et comment les remplacer en utilisant unCalendar
.la source
java.util.Date
,java.util.Calendar
etjava.text.SimpleDateFormat
sont désormais héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir Tutoriel par Oracle .La
java.util.Date
classe n'est pas vraiment obsolète, juste ce constructeur, ainsi que quelques autres constructeurs / méthodes sont obsolètes. Il est obsolète car ce type d'utilisation ne fonctionne pas bien avec l'internationalisation. LaCalendar
classe doit être utilisée à la place:Jetez un oeil à la date Javadoc:
http://download.oracle.com/javase/6/docs/api/java/util/Date.html
la source
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(<timezone id>));
java.time.*
classes sont la meilleure option ... si vous modifiez votre code.tl; dr
…ou…
Détails
Les
java.util.Date
,java.util.Calendar
et lesjava.text.SimpleDateFormat
classes ont été précipités trop rapidement lorsque Java d' abord lancé et évolué. Les cours n'étaient pas bien conçus ou mis en œuvre. Des améliorations ont été tentées, d'où les dépréciations que vous avez trouvées. Malheureusement, les tentatives d'amélioration ont largement échoué. Vous devez éviter ces cours complètement . Ils sont supplantés en Java 8 par de nouvelles classes.Problèmes dans votre code
Un java.util.Date a à la fois une date et une heure. Vous avez ignoré la portion de temps dans votre code. Ainsi, la classe Date prendra le début de la journée tel que défini par le fuseau horaire par défaut de votre JVM et appliquera cette heure à l'objet Date. Les résultats de votre code varient donc en fonction de la machine sur laquelle il s'exécute ou du fuseau horaire défini. Probablement pas ce que vous voulez.
Si vous voulez juste la date, sans la partie heure, comme pour une date de naissance, vous ne voudrez peut-être pas utiliser un
Date
objet. Vous voudrez peut-être stocker juste une chaîne de la date, au format ISO 8601 deYYYY-MM-DD
. Ou utilisez unLocalDate
objet de Joda-Time (voir ci-dessous).Joda-Time
Première chose à apprendre en Java: évitez les classes java.util.Date et java.util.Calendar notoirement gênantes fournies avec Java.
Comme indiqué correctement dans la réponse de user3277382 , utilisez Joda-Time ou le nouveau package java.time. * Dans Java 8.
Exemple de code dans Joda-Time 2.3
Dump sur console…
Lors de l'exécution ...
java.time
Dans ce cas, le code de java.time est presque identique à celui de Joda-Time .
Nous obtenons un fuseau horaire (
ZoneId
) et construisons un objet date-heure assigné à ce fuseau horaire (ZonedDateTime
). Ensuite, en utilisant le modèle Objets immuables , nous créons de nouvelles dates-heures basées sur le même instant de l'ancien objet (nombre de nanosecondes depuis l' époque ) mais assigné à un autre fuseau horaire. Enfin, nous obtenons unLocalDate
qui n'a pas d'heure ni de fuseau horaire bien que le fuseau horaire s'applique lors de la détermination de cette date (un nouveau jour se lève plus tôt à Oslo qu'à New York par exemple).À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que
java.util.Date
,Calendar
, etSimpleDateFormat
.Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers java.time classes .
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de cordes, pas besoin de
java.sql.*
cours.Où obtenir les classes java.time?
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour de futurs ajouts possibles à java.time. Vous trouverez peut - être des classes utiles ici, comme
Interval
,YearWeek
,YearQuarter
et plus .la source
L'une des raisons pour lesquelles le constructeur est obsolète est que la signification du paramètre year n'est pas celle que vous attendez. Le javadoc dit:
Notez que le champ année est le nombre d'années depuis
1900
, donc votre exemple de code ne fera probablement pas ce que vous attendez de lui. Et c'est le point.En général, l'
Date
API ne prend en charge que le calendrier occidental moderne, possède des composants spécifiés de manière idiosyncrasique et se comporte de manière incohérente si vous définissez des champs.Les API
Calendar
etGregorianCalendar
sont mieux queDate
, et les API Joda-time tierces étaient généralement considérées comme les meilleures. Dans Java 8, ils ont introduit lesjava.time
packages, et ceux-ci sont désormais l'alternative recommandée.la source
Je suis tombé sur cette question en double d' une question plus récente qui demandait quel était le moyen non obsolète d'obtenir un
Date
à une année, un mois et un jour spécifiques.Jusqu'à présent, les réponses disent d'utiliser la
Calendar
classe, et c'était vrai jusqu'à la sortie de Java 8. Mais à partir de Java 8, la façon standard de le faire est:Et puis si vous en avez vraiment besoin
java.util.Date
, vous pouvez utiliser les suggestions de cette question .Pour plus d'informations, consultez l'API ou les didacticiels pour Java 8.
la source
Veuillez noter que cela
Calendar.getTime()
n'est pas déterministe dans le sens où la partie heure par défaut est l'heure actuelle.Pour reproduire, essayez d'exécuter le code suivant plusieurs fois:
Sortie par exemple:
L'exécution du même code exact quelques minutes plus tard donne:
Ainsi, alors qu'il
set()
force les champs correspondants à corriger les valeurs, il fait perdre du temps système aux autres champs. (Testé ci-dessus avec Sun jdk6 & jdk7)la source
Date
lui-même n'est pas obsolète. C'est juste que beaucoup de ses méthodes le sont. Voir ici pour plus de détails .Utilisez
java.util.Calendar
plutôt.la source
La plupart des développeurs Java utilisent actuellement le package tiers Joda-Time . Il est largement considéré comme une bien meilleure mise en œuvre.
Java 8 aura cependant un nouveau package java.time. * . Consultez cet article, Présentation de la nouvelle API de date et d'heure pour JDK 8 .
la source
Comme le constructeur Date est obsolète, vous pouvez essayer ce code.
la source
Date
etCalendar
en 2019 est un mauvais conseil.Semblable à ce que binnyb a suggéré, vous pourriez envisager d'utiliser la nouvelle méthode Calendar> GregorianCalendar. Voir ces documents plus récents:
http://download.oracle.com/javase/6/docs/api/java/util/GregorianCalendar.html
la source
Vous pouvez créer une méthode comme
new Date(year,month,date)
dans votre code en utilisant laCalendar
classe.Cela fonctionnera comme le constructeur obsolète de
Date
la source
Instant
etZonedDateTime
.Le constructeur Date attend les années au format années depuis 1900, mois à base zéro, jours à base unique, et définit les heures / minutes / secondes / millisecondes à zéro.
Donc, en utilisant le remplacement du calendrier (années de base zéro, mois de base zéro, jours de base un) pour le constructeur Date obsolète, nous avons besoin de quelque chose comme:
Ou en utilisant Java 1.8 (qui a une année à base zéro et des mois et jours à base unique):
Voici des versions égales de Date, Calendar et Java 1.8:
la source
(façon pré-Java-8)
la source