J'ai des problèmes avec la classe Date en Java. La classe de date retourne 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?
Avec Java 8, vous pouvez écrire:
OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);
Pour répondre à votre commentaire, vous pouvez le convertir en Date (sauf si vous dépendez du code existant, je ne vois pas pourquoi), ou en millis depuis les époques:
Date date = Date.from(utc.toInstant());
long epochMillis = utc.toEpochSecond() * 1000;
_Instant.now()
_
Les anciennes classes de date-heure problématiques fournies avec les versions les plus anciennes de Java ont été supplantées par les classes Java.time intégrées à Java 8 et versions ultérieures. Voir Tutoriel Oracle . Une grande partie de la fonctionnalité a été rétroportée sur Java 6 & 7 dans ThreeTen-Backport , puis adaptée à Android in ThreeTenABP =.
Instant
Un Instant
représente un moment sur la ligne de temps de UTC avec une résolution pouvant atteindre nanosecondes .
_Instant instant = Instant.now();
_
La méthode toString
génère un objet String avec un 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 classe Instant
est une classe de bloc de construction de base dans Java.time. Cela devrait être votre classe de référence lors du traitement 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 au format UTC.
OffsetDateTime
Cependant, Instant
a des limitations telles que l’absence d’option de formatage pour la génération de chaînes dans d’autres formats. Pour plus de souplesse, convertissez Instant
en OffsetDateTime
. Spécifiez un offset-à-UTC . En Java.time, cela signifie un objet ZoneOffset
. Ici, nous voulons nous en tenir à UTC (+00) pour pouvoir utiliser la constante pratique ZoneOffset.UTC
.
_OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
_
2016-06-27T19: 15: 25.864Z
Ou ignorez la classe Instant
.
_OffsetDateTime.now( ZoneOffset.UTC )
_
Maintenant, avec un objet OffsetDateTime
en main, vous pouvez utiliser DateTimeFormatter
pour créer des objets String avec du texte dans d'autres formats. Recherchez de nombreux exemples d'utilisation de DateTimeFormatter
dans le dépassement de capacité de la pile.
ZonedDateTime
Lorsque vous souhaitez afficher heure de l'horloge murale pour un fuseau horaire particulier, appliquez un ZoneId
pour obtenir un ZonedDateTime
.
Dans cet exemple, nous appliquons le fuseau horaire de Montréal. En été, sous Heure d'été absurde, la zone a un décalage de _-04:00
_. Notez donc que l'heure de la journée est quatre heures plus tôt dans la sortie, _15
_ au lieu de _19
_ heures. Instant
et ZonedDateTime
représentent tous deux le même moment simultané, 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]
Bien que vous deviez éviter les anciennes classes date-heure, vous pouvez également convertir à l'aide 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 les nouvelles méthodes ajoutées à GregorianCalendar
(sous-classe de Calendar
) pour convertir en et de _Java.time.ZonedDateTime
_.
Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes legacy date-heure telles que Java.util.Date
, Calendar
, & SimpleDateFormat
=.
Le projet Joda-Time , actuellement en mode maintenance , recommande la migration vers les classes Java.time .
Pour en savoir plus, consultez le Oracle Tutorial . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 31 .
Vous pouvez échanger Java.time objets directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou une version ultérieure. Pas besoin de chaînes, pas besoin de _Java.sql.*
_ classes.
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 d’éventuels ajouts à Java.time. Vous pouvez trouver ici quelques classes utiles telles que Interval
, YearWeek
, YearQuarter
, et plus .
En Java8, vous utilisez la nouvelle API Time et convertissez un Instant dans en ZonedDateTime à l'aide de TC TimeZone
En Java8, je voudrais utiliser la classe Instant
qui se trouve déjà dans UTC et avec laquelle il est pratique de travailler.
import Java.time.Instant;
Instant ins = Instant.now();
long ts = ins.toEpochMilli();
Instant ins2 = Instant.ofEpochMilli(ts)
Vous pouvez également utiliser les éléments suivants:
import Java.time.*;
Instant ins = Instant.now();
OffsetDateTime odt = ins.atOffset(ZoneOffset.UTC);
ZonedDateTime zdt = ins.atZone(ZoneId.of("UTC"));
Retour à Instant
Instant ins4 = Instant.from(odt);