How to convert ZonedDateTime to milliSecond in Java?
Asked Answered
P

2

36

I'm trying to convert ZonedDateTime to milliseconds using below code.

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

But this one returns milliseconds based on local time. And it's not considering ZoneId.

Let's say LocalDateTime("2019-04-10T05:30"). If I convert this to ZonedDateTime with Zone id ("Asia/Kolkata") then I'm getting ("2019-04-10T05:30+05:30[Asia/Kolkata]"). Then I convert to EpochMilli (1554854400000) = ("Wed Apr 10 2019 00:00:00") in UTC.

Profluent answered 12/4, 2019 at 6:12 Comment(8)
Could you clarify a bit what output you are getting and what you expect? It's a bit unclear what is wrong with the code. The way you're doing it should work.Towroy
Let's say LocalDateTime("2019-04-10T05:30") . If I convert this to ZonedDateTime with Zone id ("Asia/Kolkata") then I'm getting ("2019-04-10T05:30+05:30[Asia/Kolkata]"). Then I convert to EpochMilli (1554854400000) = ("Wed Apr 10 2019 00:00:00") in UTC.Profluent
Welcome to Stack Overflow. It's not clear to me what you're trying to achieve, or what you expect the results to be. If you're not in the Asia/Kolkata time zone, you're not finding the current epoch time, certainly. Please could you give more information about what you're trying to achieve, what values you're seeing and what you expect to see?Fabrication
Well yes, 2019-04-10T05:30+05:30 and 2019-04-10T00:00:00Z represent the same instant in time. What result did you expect, and why?Fabrication
Thanks for the supplementary information. It’s always welcome, and you should always add it in your question, not in a comment. Only this time I did it for you.Noble
The conversion you describe is correct. Which result did you want to have instead?Noble
I need "EpochMilli" for "Wed Apr 10 2019 05:30:00" in UTC.Profluent
Actually, I misunderstood from the beginning, I thought - 2019-04-10T05:30+05:30[Asia/Kolkata] this is equal to 2019-04-10T11:00 in [Asia/Kolkata]. Which is totally wrong. Now I'm cleared. Thank you, guys :)Profluent
E
64

You are using an Instant to get that milliseconds representation. Instant are not zone based. Now, the epoch time is based on the "1970-01-01T00:00:00Z" so you should not have the zone in it.

If you want to create a ZoneDateTime from the epoch value, you can simply create an Instant at that epoch time and then create a ZonedDateTime with the zone you wish :

//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[Asia/Kolkata]

NOTE : The code above should not be used like this, it is not necessary to get a LocalDateTime then a ZonedDateTime to finally create an Instant. This is just to show that even with a zone, this will be "lost" at one point.
Simply use :

long e = Instant.now().toEpochMilli();
Escurial answered 12/4, 2019 at 6:41 Comment(3)
The question is about converting ZonedDateTime to milliSec. Where is it converting to miliSec in specified timezone?Falzetta
Checkout this one which actually serves the purpose. #22990567Falzetta
@MAC, It is not fresh in my mind, but the point here was to demonstrate that the expected value was not "zone based". Note that the solution you shared do works (in second), but it becomes a "zoned epoch time" that could provided some issues to convert later. Simply because you need the numerical value AND the zone to be able to work with it.Escurial
L
5
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zonedDateTime =ldt.atZone(ZoneId.of("UTC"));
zonedDateTime.toInstant().toEpochMilli();
Loreeloreen answered 16/10, 2020 at 17:35 Comment(1)
Welcome to SO! Could you explain how this solves the problem and why it's a good solution to help OP and future visitors? Thanks.Tini

© 2022 - 2024 — McMap. All rights reserved.