web-dev-qa-db-fra.com

Comment obtenir la date UTC + 0 dans Java 8?

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?

86
Mark

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;
129
assylias

tl; dr

_Instant.now()
_

Java.time

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]

Conversion

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_.

Table of types of date-time classes in modern Java.time versus legacy.


À propos de Java.time

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 .

134
Basil Bourque

En Java8, vous utilisez la nouvelle API Time et convertissez un Instant dans en ZonedDateTime à l'aide de TC TimeZone

3
rolfl

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);
0
Abel Terefe