I'm trying to get value of the exp datetime in a JWT token.
exp is the expiration time after which JWT must not be accepted.
In JavaScript I get the correct result by
new Date(1661159784*1000)
the correct result is
Mon Aug 22 2022 11:16:24 GMT+0200 (CEST)
Why didn't I get the same in Java?
Java:
System.out.println(new Date(1661159784 * 1000));
result:
Sat Dec 20 13:17:20 CET 1969
The same result setting s UTC time zone:
final ZonedDateTime exp2 = Instant.ofEpochMilli(1661159784 * 1000)
.atZone(ZoneOffset.UTC);
System.out.println(exp2);
result:
1969-12-20T12:17:20.448Z
The constructor of Date you used takes a long argument, but what you passed is in fact an (overflown) int:
public static void main(String[] args) {
int overflowedInt = 1661159784 * 1000;
System.out.println(overflowedInt);
}
Output: -992559552
The same applies to Instant.ofEpochMilli(long)…
You can get the desired result if you use Instant.ofEpochSecond(long) without multiplying by 1000:
public static void main(String[] args) {
Instant instant = Instant.ofEpochSecond(1661159784L);
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, ZoneId.of("UTC"));
System.out.println(zdt);
}
Output:
2022-08-22T09:16:24Z[UTC]
If you have to use a java.util.Date, which is not recommended anymore, either do the calculation with longs:
System.out.println(new Date(1661159784L * 1000L));
or — much better — use the compatibility method Date.from(Instant) and create the Instant as shown at the top of this answer, that is Instant.ofEpochSecond(long):
System.out.println(Date.from(Instant.ofEpochSecond(1661159784L)));
Output:
Mon Aug 22 11:16:24 CEST 2022
… in my TimeZone/ZoneId ("Europe/Berlin"), pay attention to the zones here.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With