I have an epoch second and a zoneId (see method1
below).
It can be convert to LocalDateTime
with system default zoneId, but I don't find the way to convert epoch second to LocalDateTime
(see method2
below), because there is no ZoneOffset.systemDefault
. I think it's obscure.
import java.time.{Instant, LocalDateTime, ZoneId, ZoneOffset}
val epochSecond = System.currentTimeMillis() / 1000
// method1
LocalDateTime.ofInstant(Instant.ofEpochSecond(epochSecond), ZoneId.systemDefault())
// method2
LocalDateTime.ofEpochSecond(epochSecond, 0, ZoneOffset.MAX)
The source code presented above is Scala.
Here is how you can get ZoneOffset
from ZoneId
:
Instant instant = Instant.now(); //can be LocalDateTime
ZoneId systemZone = ZoneId.systemDefault(); // my timezone
ZoneOffset currentOffsetForMyZone = systemZone.getRules().getOffset(instant);
NB: ZoneId
can have different offset depending on point in time and the history of the particular place. So choosing different Instants would result in different offsets.
NB2: ZoneId.of()
can return a ZoneOffset
instead of ZoneId
if UTC+3
/GMT+2
/etc is passed as opposed to a time zone like Africa/Cairo
. So if UTC/GMT offsets are passed then historical/geographical/daylight-saving information of the Instant
won't be taken into account - you'll simply work with the specified offset.