2016-09-29 20 views
3

Я пытаюсь преобразовать из java.sql.Date в ZonedDateTime. Это код, я используюКак конфертировать из java.sql.Date в ZonedDateTime

ZonedDateTime.from(new java.util.Date(result.get(0).getTime()).toInstant()) 

Однако, это приводит к следующей ошибке -

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: 2016-09-29T18:30:00Z of type java.time.Instant 

Есть ли способ сделать это преобразование?

ответ

4

ТЛ; Др

ZonedDateTime zdt = 
    myJavaSqlDate.toLocalDate() 
       .atStartOfDay(ZoneId.of("America/Montreal")) ; 

Подробности

Не смешивайте старые классы даты и времени с java.time. Избегайте старых классов. Поэтому ваш звонок java.util.Date не поможет.

Знайте, что java.sql.Date представляет собой значение только для даты, без времени суток и без часового пояса. К сожалению, на самом деле у него есть время суток и часовой пояс, но мы должны игнорировать эти факты. Это плохо разработанный взлом класса. Используйте его только в том случае, если у вас еще нет драйвера JDBC, поддерживающего JDBC 4.2 и типы java.time.

Поэтому, когда вы должны использовать java.sql.Date, преобразуйте его значение в LocalDate. Класс LocalDate представляет собой значение даты только без времени и без часового пояса.

Чтобы преобразовать в/из java.time, посмотрите на новые методы, добавленные к старым классам.

LocalDate ld = myJavaSqlDate.toLocalDate(); 

Идёт в другую сторону.

java.sql.Date myJavaSqlDate = java.sql.Date.valueOf(ld); 

Если ваша цель получает значение даты-времени от даты только значения, вам нужно будет указать время-дня. Если вы хотите первый момент дня, пусть java.time определит это время дня для вас. Время 00:00:00не всегда начало дня из-за аномалий, таких как летнее время (DST). Для обработки таких аномалий требуется указать часовой пояс, так как каждая зона имеет свои собственные правила для собственных аномалий. Поэтому примените ZoneId, чтобы получить объект ZonedDateTime.

ZoneId z = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = ld.atStartOfDay(z); 
1

Все, что вы можете сделать - это изменить на локальное время с указанием времени, установленного для начала дня, так как дата java sql не имеет компонента времени. Используйте часовой пояс или по умолчанию для часового пояса системы, чтобы получить зональные время Дата

ZonedDateTime zonedDateTime = ZonedDateTime.of(result.get(0).toLocalDate().atStartOfDay(), ZoneId.systemDefault()); 
Смежные вопросы