Conversione tra java.time.Instant e java.sql.Timestamp

1. Panoramica

Entrambe le classi java.time.Instant e java.sql.Timestamp rappresentano un punto sulla sequenza temporale in UTC. In altre parole, rappresentano il numero di nanosecondi dall'epoca di Java.

In questo rapido tutorial, convertiremo l'uno nell'altro utilizzando i metodi Java integrati.

2. Conversione di Instant in Timestamp e Back

Possiamo usare Timestamp.from () per convertire Instant s in Timestamp:

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

E viceversa, possiamo usare Timestamp.toInstant () per convertire i timestamp in Instant s:

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

In ogni caso, sia Instant che Timestamp rappresentano lo stesso punto sulla timeline.

Successivamente, diamo un'occhiata all'interazione tra le due classi e il fuso orario.

3. Differenze tra il metodo toString ()

Invocare toString () su Instant e Timestamp si comporta in modo diverso rispetto al fuso orario. Instant.toString () restituisce l'ora nel fuso orario UTC. D'altra parte, Timezone.toString () restituisce l'ora nel fuso orario della macchina locale.

Vediamo cosa otteniamo quando chiamiamo toString () rispettivamente su instant e timezone :

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

In questo caso, timestamp.toString () ha restituito un tempo che è di 5 ore e 30 minuti dopo il tempo restituito da instant.toString (). Questo perché il fuso orario della macchina locale è GMT +5: 30.

L'output del metodo toString () è diverso, ma sia il timestamp che l' istante rappresentano lo stesso punto sulla timeline .

Possiamo anche verificarlo convertendo il Timestamp nel fuso orario 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. Conclusione

In questo rapido tutorial, abbiamo visto come convertire tra classi java.time.Instant e java.sql.Timestamp in Java utilizzando metodi integrati.

Abbiamo anche esaminato come il fuso orario influisce su come cambia l'output.

E, come sempre, gli esempi di codice completi sono disponibili su GitHub.