Как сделать время 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".

Другие вопросы по тегам