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 .