tl; dr
LocalDate.of( 1985 , 1 , 1 )
…ou…
LocalDate.of( 1985 , Month.JANUARY , 1 )
Détails
Les java.util.Date
, java.util.Calendar
et les java.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 de YYYY-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
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 sur 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 );
Lors de l'exécution ...
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 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 un LocalDate
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).
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 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
, et SimpleDateFormat
.
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 dejava.sql.*
cours.
Où obtenir les classes java.time?
- Java SE 8 , Java SE 9 , Java SE 10 et versions ultérieures
- Intégré.
- Une partie de l'API Java standard avec une implémentation groupée.
- Java 9 ajoute quelques fonctionnalités et correctifs mineurs.
- Java SE 6 et Java SE 7
- Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
- Android
- Versions ultérieures des implémentations de bundles Android des classes java.time.
- Pour les versions antérieures d'Android (<26), le projet ThreeTenABP adapte ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP… .
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 .