Estoy tratando de obtener el valor de la fecha y hora de exp en un token JWT. exp es el tiempo de vencimiento después del cual no se debe aceptar JWT.
En JavaScript obtengo el resultado correcto por
new Date(1661159784*1000)el resultado correcto es
Mon Aug 22 2022 11:16:24 GMT+0200 (CEST)¿Por qué no obtuve lo mismo en Java?
Java:
System.out.println(new Date(1661159784 * 1000));resultado:
Sat Dec 20 13:17:20 CET 1969El mismo resultado configurando la zona horaria UTC:
final ZonedDateTime exp2 = Instant.ofEpochMilli(1661159784 * 1000) .atZone(ZoneOffset.UTC); System.out.println(exp2);resultado:
1969-12-20T12:17:20.448ZEl constructor de Date que usó toma un argumento long , pero lo que pasó es de hecho un int (desbordado):
public static void main(String[] args) { int overflowedInt = 1661159784 * 1000; System.out.println(overflowedInt); } Salida: -992559552
Lo mismo se aplica a Instant.ofEpochMilli(long) …
Puede obtener el resultado deseado si usa Instant.ofEpochSecond(long) sin multiplicar por 1000:
public static void main(String[] args) { Instant instant = Instant.ofEpochSecond(1661159784L); ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, ZoneId.of("UTC")); System.out.println(zdt); }Producción:
2022-08-22T09:16:24Z[UTC] Si tiene que usar java.util.Date , que ya no se recomienda, haga el cálculo con long s:
System.out.println(new Date(1661159784L * 1000L)); o, mucho mejor , use el método de compatibilidad Date.from(Instant) y cree el Instant como se muestra en la parte superior de esta respuesta, que es Instant.ofEpochSecond(long) :
System.out.println(Date.from(Instant.ofEpochSecond(1661159784L)));Producción:
Mon Aug 22 11:16:24 CEST 2022 … en mi TimeZone / ZoneId ("Europa/Berlín"), preste atención a las zonas aquí.