tl; dr
Instant.now()
java.time
Les anciennes classes de date-heure gênantes fournies avec les premières versions de Java ont été remplacées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir le didacticiel Oracle . Une grande partie des fonctionnalités a été rétroportée sur Java 6 et 7 dans ThreeTen-Backport et adaptée à Android dans ThreeTenABP .
Instant
An Instant
représente un moment sur la chronologie en UTC avec une résolution allant jusqu'à nanosecondes .
Instant instant = Instant.now();
La toString
méthode génère un objet String avec du texte représentant la valeur date-heure en utilisant l'un des formats standard ISO 8601 .
String output = instant.toString();
2016-06-27T19: 15: 25.864Z
La Instant
classe est une classe élémentaire de base dans java.time. Cela devrait être votre classe préférée lors de la gestion de la date et de l'heure, car la meilleure pratique consiste généralement à suivre, stocker et échanger des valeurs de date et d'heure en UTC.
OffsetDateTime
Mais Instant
a des limitations telles que l'absence d'options de formatage pour générer des chaînes dans d'autres formats. Pour plus de flexibilité, passez de Instant
à OffsetDateTime
. Spécifiez un décalage par rapport à UTC . En java.time, cela signifie un ZoneOffset
objet. Ici, nous voulons nous en tenir à UTC (+00) afin de pouvoir utiliser la constante pratique ZoneOffset.UTC
.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
2016-06-27T19: 15: 25.864Z
Ou sautez le Instant
cours.
OffsetDateTime.now( ZoneOffset.UTC )
Maintenant, avec un OffsetDateTime
objet en main, vous pouvez utiliser DateTimeFormatter
pour créer des objets String avec du texte dans d'autres formats. Recherchez Stack Overflow pour de nombreux exemples d'utilisation DateTimeFormatter
.
ZonedDateTime
Lorsque vous souhaitez afficher l' heure de l'horloge murale pour un fuseau horaire particulier, appliquez a ZoneId
pour obtenir un ZonedDateTime
.
Dans cet exemple, nous appliquons le fuseau horaire de Montréal. En été, sous le non-sens de l' heure d'été (DST) , la zone a un décalage de -04:00
. Notez donc que l'heure du jour est quatre heures plus tôt dans la sortie, 15
au lieu d' 19
heures. Instant
et les ZonedDateTime
deux représentent le même moment simultané, juste vu à travers deux lentilles différentes.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
2016-06-27T15: 15: 25.864-04: 00 [Amérique / Montréal]
Conversion
Bien que vous deviez éviter les anciennes classes date-heure, si vous le devez, vous pouvez convertir en utilisant de nouvelles méthodes ajoutées aux anciennes classes. Ici, nous utilisons java.util.Date.from( Instant )
et java.util.Date::toInstant
.
java.util.Date utilDate = java.util.Date.from( instant );
Et aller dans l'autre sens.
Instant instant= utilDate.toInstant();
De même, recherchez de nouvelles méthodes ajoutées à GregorianCalendar
(sous-classe de Calendar
) pour convertir vers et depuis java.time.ZonedDateTime
.
À 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
.
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .
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 chaînes, pas besoin de java.sql.*
classes. Hibernate 5 et JPA 2.2 prennent en charge java.time .
Où obtenir les classes java.time?
java.util.Date
n'est jamais une date de machine locale. Il est toujours défini en millisecondes écoulées depuis le 01/01/1970 par rapport à UTC + 00: 00. Peut-être que le comportement de sa méthodetoString()
vous déroute qui utilise en effet une représentation dans le fuseau horaire local.