Как сделать время UTC для java.sql.Timestamp?
public static void main(String[] args) {
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.systemDefault());
Instant instant = Instant.from(zdt);
Timestamp timestamp = Timestamp.from(instant);
System.out.println(ldt + "\n");
System.out.println(zdt + "\n");
System.out.println(instant + "\n");
System.out.println(timestamp + "\n");
}
И это печатает:
2017-05-07T18:13:26.969
2017-05-07T18:13:26.969-04:00[America/New_York]
2017-05-07T22:13:26.969Z
2017-05-07 18:13:26.969
Как я могу сделать SQL Timestamp
сохранить с тем же временем, что и Instant
? Я должен быть в состоянии получить Timestamp
откуда угодно и преобразовать его в любое время, когда оно окажется в этой части мира. Проблема в том, что он сохраняет время так же, как и то, на что настроены мои системные часы.
2 ответа
Решение
Вы лучше всего, чтобы получить Timestamp
из LocalDateTime
, а не из Instant
,
Первый шаг - взять ZonedDateTime
и преобразовать его в GMT:
ZonedDateTime gmt = zdt.withZoneSameInstant(ZoneId.of("GMT"));
Затем вы можете преобразовать его в Timestamp
через LocalDateTime
:
Timestamp timestamp = Timestamp.valueOf(gmt.toLocalDateTime());
Возможно, вам придется использовать специальную перегрузку setTimestamp, которая принимает объект Calendar, если вы хотите представить значение "TIMESTAMP WITH TIME ZONE".