web-dev-qa-db-fra.com

Comment convertir ZonedDateTime en milliSecond en Java?

J'essaie de convertir ZonedDateTime en millisecondes en utilisant le code ci-dessous.

LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zonedDateTime =ldt.atZone(ZoneId.of(""Asia/Kolkata""));
zonedDateTime.toInstant().toEpochMilli();

Mais celui-ci renvoie des millisecondes en fonction de l'heure locale. Et il ne tient pas compte de ZoneId.

Disons LocalDateTime("2019-04-10T05:30"). Si je le convertis en ZonedDateTime avec l'ID de zone ("Asia/Kolkata"), je reçois ("2019-04-10T05:30+05:30[Asia/Kolkata]"). Ensuite, je me convertis en EpochMilli (1554854400000) = ("Wed Apr 10 2019 00:00:00") En UTC.

9
Arun

Vous utilisez un Instant pour obtenir cette représentation en millisecondes. Les instantanés ne sont pas basés sur une zone. Maintenant, le temps Epoch est basé sur le "1970-01-01T00: 00: 00Z" donc vous ne devriez pas avoir la zone dedans.

Si vous souhaitez créer un ZoneDateTime à partir de la valeur Epoch, vous pouvez simplement créer un Instant à ce moment Epoch puis créer un ZonedDateTime avec la zone souhaitée:

//Let's create our zone time (just to keep your logic
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zonedDateTime =ldt.atZone(ZoneId.of("Asia/Kolkata"));

//Then get the Epoch on GMT
long e = zonedDateTime.toInstant().toEpochMilli();

Instant i = Instant.ofEpochMilli(e);
System.out.println(ZonedDateTime.ofInstant(i, ZoneId.systemDefault()));
System.out.println(ZonedDateTime.ofInstant(i, ZoneId.of("Asia/Kolkata")));

2019-04-12T05: 10: 31.016 + 02: 00 [Europe/Paris]
2019-04-12T08: 40: 31.016 + 05: 30 [Asie/Calcutta]

REMARQUE: Le code ci-dessus ne doit pas être utilisé comme ceci, il n'est pas nécessaire d'obtenir un LocalDateTime puis un ZonedDateTime pour enfin créer un Instant. C'est juste pour montrer que même avec une zone, cela sera "perdu" à un moment donné.
Utilisez simplement:

long e = Instant.now().toEpochMilli();
16
AxelH