Перейти к основному содержимому

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

· 2 мин. чтения

1. Обзор

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

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

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

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

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

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

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

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

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

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

Вызов toString() для Instant и Timestamp ведет себя по-разному в зависимости от часового пояса. Instant.toString() возвращает время в часовом поясе UTC. С другой стороны, Timezone.toString() возвращает время в часовом поясе локального компьютера.

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

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

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

Вывод метода toString() отличается, но и отметка времени , и момент времени представляют одну и ту же точку на временной шкале .

Мы также можем проверить это, преобразовав метку времени в часовой пояс UTC:

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. Вывод

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

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

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