Convertir entre java.time.Instant y java.sql.Timestamp

1. Información general

Ambas clases java.time.Instant y java.sql.Timestamp representan un punto en la línea de tiempo en UTC. En otras palabras, representan el número de nanosegundos desde la época de Java.

En este tutorial rápido, convertiremos uno al otro utilizando métodos incorporados de Java.

2. Conversión de Instant a Timestamp y Back

Podemos usar Timestamp.from () para convertir Instant s en Timestamps:

Instant instant = Instant.now(); Timestamp timestamp = Timestamp.from(instant); assertEquals(instant.toEpochMilli(), timestamp.getTime());

Y viceversa, podemos usar Timestamp.toInstant () para convertir Timestamp s en Instant s:

instant = timestamp.toInstant(); assertEquals(instant.toEpochMilli(), timestamp.getTime());

De cualquier manera, tanto Instant como Timestamp representan el mismo punto en la línea de tiempo.

A continuación, echemos un vistazo a la interacción entre las dos clases y la zona horaria.

3. Diferencias del método toString ()

Invocar toString () en Instant y Timestamp se comporta de manera diferente con respecto a la zona horaria. Instant.toString () devuelve la hora en la zona horaria UTC. Por otro lado, Timezone.toString () devuelve la hora en la zona horaria de la máquina local.

Veamos qué obtenemos al llamar a toString () en instant y timezone respectivamente:

Instant (in UTC): 2018-10-18T00:00:57.907Z Timestamp (in GMT +05:30): 2018-10-18 05:30:57.907

Aquí, timestamp.toString () resultó en un tiempo que es 5 horas 30 minutos después del tiempo devuelto por instant.toString (). Esto se debe a que la zona horaria de la máquina local está en GMT +5: 30.

La salida del método toString () es diferente, pero tanto la marca de tiempo como el instante representan el mismo punto en la línea de tiempo .

También podemos verificar esto convirtiendo la marca de tiempo a la zona horaria UTC:

DateFormat df = DateFormat.getDateTimeInstance(); df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SS'Z'"); df.setTimeZone(TimeZone.getTimeZone("UTC")); assertEquals(instant.toString(), df.format(timestamp).toString());

4. Conclusión

En este tutorial rápido, vimos cómo convertir entre las clases java.time.Instant y java.sql.Timestamp en Java usando métodos integrados.

También vimos cómo la zona horaria afecta cómo cambia la salida.

Y, como siempre, los ejemplos de código completos están disponibles en GitHub.