Java >> Java tutorial >  >> Tag >> SQL

Konverter mellem java.time.Instant og java.sql.Timestamp

1. Oversigt

Begge java.time.Instant og java.sql.Timestamp klasser repræsenterer et punkt på tidslinjen i UTC. Med andre ord repræsenterer de antallet af nanosekunder siden Java-epoken.

I dette hurtige selvstudie konverterer vi den ene til den anden ved at bruge indbyggede Java-metoder.

2. Konvertering af Instant til tidsstempel og tilbage

Vi kan bruge Timestamp.from() for at konvertere Instant s i tidsstempler:

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

Og omvendt kan vi bruge Timestamp.toInstant() for at konvertere tidsstempel er i Instant s:

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

Uanset, både Instant og Tidsstempel repræsenterer det samme punkt på tidslinjen.

Lad os derefter se på interaktionen mellem de to klasser og tidszonen.

3. toString() Metodeforskelle

Bruger toString() på Instant og tidsstempel opfører sig anderledes med hensyn til tidszone. Instant.toString() returnerer tiden i UTC-tidszone. På den anden side, Timezone.toString() returnerer tiden i den lokale maskintidszone.

Lad os se, hvad vi får, når vi kalder toString() på øjeblikkelig og tidsstempel henholdsvis:

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

Her, timestamp.toString() resulterede i en tid, der er 5 timer og 30 minutter efter den tid, der returneres af instant.toString(). Dette skyldes, at den lokale maskines tidszone er på GMT +5:30 tidszone.

Outputtet fra toString() metoden er anderledes, men både tidsstemplet og øjeblikkelig repræsentere det samme punkt på tidslinjen .

Vi kan også bekræfte dette ved at konvertere tidsstemplet til UTC-tidszonen:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
formatter = formatter.withZone(TimeZone.getTimeZone("UTC").toZoneId());
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

assertThat(formatter.format(instant)).isEqualTo(df.format(timestamp));

4. Konklusion

I denne hurtige tutorial så vi, hvordan man konverterer mellem java.time.Instant og java.sql.Timestamp klasser i Java ved hjælp af indbyggede metoder.

Vi havde også et kig på, hvordan tidszonen påvirker, hvordan output ændres.

Og som altid er de komplette kodeeksempler tilgængelige på GitHub.


Java tag