ТЛ; Др
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);