Convert zwischen java.time.Instant und java.sql.Timestamp

Zwischen java.time.Instant und java.sql.Timestamp konvertieren

1. Überblick

Sowohl die Klassenjava.time.Instant als auchjava.sql.Timestamp repräsentieren einen Punkt auf der Zeitachse in UTC. Mit anderen Worten, sie repräsentieren die Anzahl der Nanosekunden seitthe Java epoch.

In diesem kurzen Tutorial konvertieren wir mithilfe der integrierten Java-Methoden eine in die andere.

2. Konvertieren vonInstant inTimestamp und zurück

Wir könnenTimestamp.from() verwenden, umInstants in Zeitstempel umzuwandeln:

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

Und umgekehrt können wirTimestamp.toInstant() verwenden, umTimestamps inInstants umzuwandeln: __

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

In beiden Fällen repräsentieren sowohlInstant als auchTimestamp denselben Punkt auf der Zeitachse.

Schauen wir uns als nächstes die Interaktion zwischen den beiden Klassen und der Zeitzone an.

3. toString() Methodenunterschiede

Invoking toString() on Instant and Timestamp behaves differently with respect to timezone.Instant.toString() gibt die Zeit in der UTC-Zeitzone zurück. Andererseits gibtTimezone.toString() die Zeit in der Zeitzone des lokalen Computers zurück.

Mal sehen, was wir bekommen, wenn wirtoString() aufinstant bzw.timezone aufrufen:

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

Here, timestamp.toString() ergab eine Zeit, die 5 Stunden 30 Minuten nach der voninstant.toString(). zurückgegebenen Zeit liegt. Dies liegt daran, dass die Zeitzone der lokalen Maschine bei GMT +5: 30 liegt.

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

Wir können dies auch überprüfen, indem wirTimestamp in die UTC-Zeitzone konvertieren:

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. Fazit

In diesem kurzen Tutorial haben wir gesehen, wie man mit integrierten Methoden zwischenjava.time.Instant undjava.sql.Timestamp Klassen in Java konvertiert.

Wir haben uns auch angesehen, wie sich die Zeitzone auf die Änderung der Ausgabe auswirkt.

Und wie immer sind die vollständigen Codebeispieleover on GitHub verfügbar.