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.
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();