конвертировать между java.time.Instant и java.sql.Timestamp

Преобразование между java.time.Instant и java.sql.Timestamp

1. обзор

Оба классаjava.time.Instant иjava.sql.Timestamp представляют собой точку на временной шкале в формате UTC. Другими словами, они представляют количество наносекунд с моментаthe Java epoch.

В этом кратком руководстве мы преобразуем одно в другое с помощью встроенных методов Java.

2. ПреобразованиеInstant вTimestamp и обратно

Мы можем использоватьTimestamp.from() для преобразованияInstants в метки времени:

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

И наоборот, мы можем использоватьTimestamp.toInstant() для преобразованияTimestamps вInstants: __

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

В любом случае,Instant иTimestamp представляют одну и ту же точку на временной шкале.

Затем давайте посмотрим на взаимодействие между двумя классами и часовым поясом.

3. toString() Различия в методах

Invoking toString() on Instant and Timestamp behaves differently with respect to timezone.Instant.toString() возвращает время в часовом поясе UTC. С другой стороны,Timezone.toString() возвращает время в часовом поясе локального компьютера.

Давайте посмотрим, что мы получим при вызовеtoString() дляinstant иtimezone соответственно:

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

Here, timestamp.toString() привело к времени, которое на 5 часов 30 минут позже времени, возвращаемогоinstant.toString().. Это потому, что часовой пояс локального компьютера находится в часовом поясе GMT ​​+5: 30.

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

Мы также можем проверить это, преобразовавTimestamp в часовой пояс 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. Заключение

В этом кратком руководстве мы увидели, как преобразовать классыjava.time.Instant иjava.sql.Timestamp в Java с помощью встроенных методов.

Мы также рассмотрели, как часовой пояс влияет на изменение выходных данных.

И, как всегда, доступны полные примеры кодаover on GitHub.