How can I convert a time in milliseconds to ZonedDateTime
You can construct a ZonedDateTime
from an instant (this uses the system zone ID):
//Instant is time-zone unaware, the below will convert to the given zone
ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.ofEpochMilli(m),
ZoneId.systemDefault());
And if you need a LocalDateTime
instance from that:
//And this date-time will be "local" to the above zone
LocalDateTime ldt = zdt.toLocalDateTime();
ZonedDateTime
and LocalDateTime
are different.
If you need LocalDateTime
, you can do it this way:
long m = ...;
Instant instant = Instant.ofEpochMilli(m);
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
Whether you want a ZonedDateTime
, LocalDateTime
, OffsetDateTime
, or LocalDate
, the syntax is really the same, and all revolves around applying the milliseconds to an Instant
first using Instant.ofEpochMilli(m)
.
long m = System.currentTimeMillis();
ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.ofEpochMilli(m), ZoneId.systemDefault());
LocalDateTime ldt = LocalDateTime.ofInstant(Instant.ofEpochMilli(m), ZoneId.systemDefault());
OffsetDateTime odt = OffsetDateTime.ofInstant(Instant.ofEpochMilli(m), ZoneId.systemDefault());
LocalDate ld = LocalDate.ofInstant(Instant.ofEpochMilli(m), ZoneId.systemDefault());
Printing them would produce something like this:
2018-08-21T12:47:11.991-04:00[America/New_York]
2018-08-21T12:47:11.991
2018-08-21T12:47:11.991-04:00
2018-08-21
Printing the Instant
itself would produce:
2018-08-21T16:47:11.991Z