Как преобразовать java.sql.timestamp в LocalDate (java8) java.time?

В Java 8, как я могу преобразовать Timestampjava.sql) в LocalDatejava.time)?

Ответ 1

Вы можете сделать:

timeStamp.toLocalDateTime().toLocalDate();

Обратите внимание, что timestamp.toLocalDateTime() будет использовать часовой пояс Clock.systemDefaultZone() для выполнения преобразования. Это может или не может быть тем, что вы хотите.

Ответ 2

Я немного расширю ответ @assylias, чтобы учесть часовой пояс. Есть как минимум два способа получить LocalDateTime для определенного часового пояса.

Вы можете использовать часовой пояс setDefault для всего приложения. Он должен быть вызван перед любой отметкой времени → java.time:

public static void main(String... args) {
    TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
    TimeZone.setDefault(utcTimeZone);
    ...
    timestamp.toLocalDateTime().toLocalDate();
}

Или вы можете использовать цепочку toInstant.atZone:

timestamp.toInstant()
        .atZone(ZoneId.of("UTC"))
        .toLocalDate();

Ответ 3

Принятый ответ не идеален, поэтому я решил добавить свои 2 цента

timeStamp.toLocalDateTime().toLocalDate();

это плохое решение в целом, я даже не уверен, почему они добавили этот метод в JDK, так как это делает вещи действительно запутанными, делая неявное преобразование с использованием системного часового пояса. Обычно, когда используются только классы даты java8, программист вынужден указывать часовой пояс, что хорошо.

Хорошее решение -

timestamp.toInstant().atZone(zoneId).toLocalDate()

Где zoneId - это часовой пояс, который вы хотите использовать. Обычно это ZoneId.systemDefault(), если вы хотите использовать системный часовой пояс или какой-либо жестко закодированный часовой пояс, например ZoneOffset..UTC

Общий подход должен быть

  1. Освободитесь от новых классов дат java8, используя класс, который имеет прямое отношение, например, в нашем случае java.time.Instant напрямую связан с java.sql.Timestamp, т.е. преобразование часовых поясов между ними не требуется.
  2. Используйте правильно разработанные методы в этом классе java8, чтобы делать правильные вещи. В нашем случае atZone (zoneId) прямо указали, что мы выполняем преобразование и используем для него определенный часовой пояс.