J'ai des problèmes avec la classe Date en Java. La classe de date renvoie la date de la machine locale mais j'ai besoin de UTC-0.
J'ai cherché sur Google et trouvé une excellente solution pour JavaScript mais pour Java rien d'utile.
Comment obtenir la date UTC + 0 dans Java 8?
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.Réponses:
Avec Java 8, vous pouvez écrire:
Pour répondre à votre commentaire, vous pouvez ensuite le convertir en date (sauf si vous dépendez du code hérité je ne vois aucune raison pour laquelle) ou en millis depuis les époques:
la source
OffsetDateTime
plutôt queZonedDateTime
étant donné que nous travaillons avec un simple décalage par rapport à UTC plutôt qu'un fuseau horaire complet?tl; dr
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 .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 .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 deInstant
àOffsetDateTime
. Spécifiez un décalage par rapport à UTC . En java.time, cela signifie unZoneOffset
objet. Ici, nous voulons nous en tenir à UTC (+00) afin de pouvoir utiliser la constante pratiqueZoneOffset.UTC
.Ou sautez le
Instant
cours.Maintenant, avec un
OffsetDateTime
objet en main, vous pouvez utiliserDateTimeFormatter
pour créer des objets String avec du texte dans d'autres formats. Recherchez Stack Overflow pour de nombreux exemples d'utilisationDateTimeFormatter
.ZonedDateTime
Lorsque vous souhaitez afficher l' heure de l'horloge murale pour un fuseau horaire particulier, appliquez a
ZoneId
pour obtenir unZonedDateTime
.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 lesZonedDateTime
deux représentent le même moment simultané, juste vu à travers deux lentilles différentes.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 )
etjava.util.Date::toInstant
.Et aller dans l'autre sens.
De même, recherchez de nouvelles méthodes ajoutées à
GregorianCalendar
(sous-classe deCalendar
) pour convertir vers et depuisjava.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
, etSimpleDateFormat
.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?
la source
ZonedDateTime
ce ne serait pas nécessaire puisque toutZoneId
serait mappé à celui queZoneOffset
nous pourrions simplement utiliserOffsetDateTime
?En java8, j'utiliserais la
Instant
classe qui est déjà en UTC et avec laquelle il est pratique de travailler.Vous pouvez également utiliser les éléments suivants:
Retour à
Instant
la source
Instant
n'est pas à l'heure locale. UnInstant
par définition est en UTC. Donc pas besoin des machinations vues dans cette réponse essayant d'entrer dans UTC; leInstant
déjà est en UTC. Voir ma réponse pour plus d'informations et un code beaucoup plus simple.Dans Java8, vous utilisez la nouvelle API Time et convertissez un instant en un ZonedDateTime à l' aide de la zone horaire UTC
la source
Solution 1 ligne en Java 8:
la source