Converter entre java.time.Instant e java.sql.Timestamp

Converter entre java.time.Instant e java.sql.Timestamp

1. Visão geral

Ambas as classesjava.time.Instantejava.sql.Timestamp representam um ponto na linha do tempo em UTC. Em outras palavras, eles representam o número de nanossegundos desdethe Java epoch.

Neste tutorial rápido, vamos converter um para o outro usando métodos Java integrados.

2. ConvertendoInstant emTimestamp e de volta

Podemos usarTimestamp.from() para converterInstants em carimbos de data / hora:

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

E vice-versa, podemos usarTimestamp.toInstant() para converterTimestamps emInstants: __

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

De qualquer forma,Instant eTimestamp representam o mesmo ponto na linha do tempo.

A seguir, vamos dar uma olhada na interação entre as duas classes e o fuso horário.

3. toString() Diferenças de método

Invoking toString() on Instant and Timestamp behaves differently with respect to timezone.Instant.toString() retorna a hora no fuso horário UTC. Por outro lado,Timezone.toString() retorna a hora no fuso horário da máquina local.

Vamos ver o que obtemos ao chamartoString() eminstantetimezone, respectivamente:

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

Here, timestamp.toString() resultou em um tempo que é 5 horas e 30 minutos após o tempo retornado porinstant.toString().. Isso ocorre porque o fuso horário da máquina local está no fuso horário GMT +5: 30.

The output of the toString() method is different, but both the timestamp and instant represent the same point on the timeline.

Também podemos verificar isso convertendoTimestamp para o fuso horário 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. Conclusão

Neste tutorial rápido, vimos como converter entre as classesjava.time.Instantejava.sql.Timestamp em Java usando métodos integrados.

Também vimos como o fuso horário afeta como a saída é alterada.

E, como sempre, os exemplos de código completos estão disponíveisover on GitHub.