Tl;dr
LocalDate.of( 1985 , 1 , 1 )
ou
LocalDate.of( 1985 , Month.JANUARY , 1 )
Détails
Le site java.util.Date
, java.util.Calendar
y java.text.SimpleDateFormat
Les classes ont été précipitées trop rapidement lorsque Java a été lancé et a évolué. Les classes n'étaient pas bien conçues ou implémentées. Des améliorations ont été tentées, d'où les dépréciations que vous avez trouvées. Malheureusement, ces tentatives d'amélioration ont largement échoué. Vous devriez éviter ces classes tout à fait. Elles sont supprimées dans Java 8 par de nouvelles classes.
Problèmes dans votre code
Une date java.util.Date possède à la fois une partie date et une partie heure. Vous avez ignoré la partie heure dans votre code. La classe Date prendra donc 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 varieront donc en fonction de la machine sur laquelle il est exécuté ou du fuseau horaire défini. Ce n'est probablement pas ce que vous souhaitez.
Si vous ne voulez que la date, sans la partie temps, comme pour une date de naissance, vous ne voudrez peut-être pas utiliser une balise Date
objet. Vous pouvez vouloir stocker juste une chaîne de caractères de la date, dans l'objet ISO 8601 format de YYYY-MM-DD
. Ou utilisez un LocalDate
de Joda-Time (voir ci-dessous).
Joda-Time
Première chose à apprendre en Java : Évitez les classes java.util.Date et java.util.Calendar, réputées pour leurs difficultés. fourni avec Java.
Comme il a été correctement noté dans la réponse de user3277382 utilisez soit Joda-Time ou le nouveau paquet java.time.* en Java 8.
Exemple de code en Joda-Time 2.3
DateTimeZone timeZoneNorway = DateTimeZone.forID( "Europe/Oslo" );
DateTime birthDateTime_InNorway = new DateTime( 1985, 1, 1, 3, 2, 1, timeZoneNorway );
DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" );
DateTime birthDateTime_InNewYork = birthDateTime_InNorway.toDateTime( timeZoneNewYork );
DateTime birthDateTime_UtcGmt = birthDateTime_InNorway.toDateTime( DateTimeZone.UTC );
LocalDate birthDate = new LocalDate( 1985, 1, 1 );
Dump à la console
System.out.println( "birthDateTime_InNorway: " + birthDateTime_InNorway );
System.out.println( "birthDateTime_InNewYork: " + birthDateTime_InNewYork );
System.out.println( "birthDateTime_UtcGmt: " + birthDateTime_UtcGmt );
System.out.println( "birthDate: " + birthDate );
Quand on court
birthDateTime_InNorway: 1985-01-01T03:02:01.000+01:00
birthDateTime_InNewYork: 1984-12-31T21:02:01.000-05:00
birthDateTime_UtcGmt: 1985-01-01T02:02:01.000Z
birthDate: 1985-01-01
java.time
Dans ce cas, le code pour java.time est presque identique à celui de Joda-Time .
Nous obtenons un fuseau horaire ( ZoneId
), et construire un objet date-heure affecté à ce fuseau horaire ( ZonedDateTime
). Ensuite, en utilisant le Objets immuables nous créons de nouvelles dates-horaires basées sur l'instant même de l'ancien objet (nombre de nanosecondes écoulées depuis le début de l'année). époque ) mais a attribué un autre fuseau horaire. Enfin, nous obtenons un LocalDate
qui n'a ni heure du jour ni fuseau horaire, mais remarquez que le fuseau horaire s'applique lors de la détermination de cette date (un nouveau jour se lève plus tôt dans l'UE). Oslo que dans New York par exemple).
ZoneId zoneId_Norway = ZoneId.of( "Europe/Oslo" );
ZonedDateTime zdt_Norway = ZonedDateTime.of( 1985 , 1 , 1 , 3 , 2 , 1 , 0 , zoneId_Norway );
ZoneId zoneId_NewYork = ZonedId.of( "America/New_York" );
ZonedDateTime zdt_NewYork = zdt_Norway.withZoneSameInstant( zoneId_NewYork );
ZonedDateTime zdt_Utc = zdt_Norway.withZoneSameInstant( ZoneOffset.UTC ); // Or, next line is similar.
Instant instant = zdt_Norway.toInstant(); // Instant is always in UTC.
LocalDate localDate_Norway = zdt_Norway.toLocalDate();
À propos de java.time
Le site java.time est intégré à Java 8 et aux versions ultérieures. Ces classes remplacent les anciennes classes héritage les classes de date et d'heure telles que java.util.Date
, Calendar
, & SimpleDateFormat
.
Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez sur Stack Overflow de nombreux exemples et explications. La spécification est JSR 310 .
Le site Joda-Time Le projet, actuellement en mode de maintenance conseille la migration vers le java.time classes.
Vous pouvez échanger java.time directement avec votre base de données. Utilisez un Pilote JDBC conforme à JDBC 4.2 ou plus tard. Pas besoin de ficelles, pas besoin de java.sql.*
classes. Support de Hibernate 5 et JPA 2.2 java.time .
Où obtenir les classes java.time ?
-
Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 et ultérieures - Partie de l'API Java standard avec une mise en œuvre groupée.
-
Java 9 a apporté quelques fonctionnalités et corrections mineures.
-
Java SE 6 y Java SE 7
- La plupart des java.time est rétroportée vers Java 6 et 7 dans la section Trois Dix-Backport .
-
Android
- Les versions ultérieures d'Android (26+) intègrent des implémentations de l'algorithme de l'utilisateur. java.time classes.
- Pour les versions antérieures d'Android (<26), la dernière version de l'outil Android permet un processus connu sous le nom de Désamorçage de l'API pour fournir un sous-ensemble de la java.time une fonctionnalité qui n'était pas intégrée à l'origine dans Android.
45 votes
Je suis en train de vivre une courbe d'apprentissage similaire, passant également de C# à Java. L'autre chose qui m'a piqué est que le mois de l'année est un système basé sur 0 (0 à 11 où Jan. = 0 et Dec. = 11) mais les jours du mois sont basés sur 1 (1 à 31). Attention à ce problème !
3 votes
@Paul Sasik, oui, mais il existe une constante Calendar.JANUARY par exemple, et une pour chaque mois.
1 votes
Duplication possible de Pourquoi "new Date(int year, int month, int day)" a-t-il été déprécié ?
7 votes
@PaulSasik lol. Ouais, stupide Java. J'ai dû passer de C# à Java et OMG la douleur et la misère.
2 votes
Duplicata possible de Pourquoi la plupart des méthodes de java.util.Date ont-elles été dépréciées ?
9 votes
Les remarques sarcastiques "lol" à propos de Java de la part des gens de C# ont fait moi rire parce que .Net a obtenu sa bibliothèque décente de date-heure ( Heure de Noda ) à partir d'un portage de l'excellente bibliothèque Java Joda-Time .
2 votes
Il a été recommandé par Oracle de passer à java.time dans Java 8. docs.oracle.com/javase/tutorial/datetime/iso/legacy.html
1 votes
L'équipe de Joda-Time nous conseille également de migrer vers java.time. Il n'y a aucune raison de ne pas commencer à migrer. Une grande partie de la fonctionnalité de java.time est rétroportée vers Java 6 et 7 dans le module Trois Dix-Backport et adapté à Android dans ThreeTenABP.
0 votes
Note : Ce constructeur de date s'attend à ce que les années soient saisies en utilisant 1900 comme base. Ainsi, pour représenter l'année 1985 dans l'objet Date, vous devez passer 85 comme année d'entrée. La date de votre exemple stockera l'année 3885.
1 votes
Aux futurs lecteurs Cette question a été posée en 2011, et la réponse acceptée n'est pas la manière dont vous devez procéder aujourd'hui. Cette réponse est meilleur.
1 votes
@MCEmperor Merci, j'ai mis à jour la "Réponse acceptée" pour qu'elle soit celle-là à la place.