Есть ли более правильный путь?
Да, есть.
LocalDate.now(
ZoneId.of( "America/Montreal" )
).atStartOfDay(
ZoneId.of( "America/Montreal" )
)
java.time
Java 8 и новее сейчасимеет новый встроенный фреймворк java.time.См. Учебное пособие .Вдохновленный Joda-Time, определенным JSR 310 и расширенным проектом ThreeTen-Extra.
Примеры
Ниже приведены некоторые примеры с использованием java.time.Обратите внимание, как они указывают часовой пояс.Если опущено, текущий часовой пояс вашей JVM по умолчанию.Это значение по умолчанию может изменяться, даже изменяться в любой момент во время выполнения, поэтому я предлагаю вам указать часовой пояс явно, а не полагаться неявно на значение по умолчанию.
Вот пример только даты, без временидень и часовой пояс.
ZoneId zonedId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zonedId );
System.out.println( "today : " + today );
сегодня: 2015-10-19
Вот пример получения текущей даты-времени.
ZoneId zonedId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.now( zonedId );
System.out.println( "zdt : " + zdt );
При запуске:
Зд .: 2015-10-19T18: 07: 02.910-04: 00 [Америка / Монреаль]
Первый момент дня
Вопрос запрашивает дату-время, когда время установлено на ноль.Предполагается, что первым моментом дня всегда является время 00:00:00.0
, но это не всегда так.Летнее время (DST) и, возможно, другие аномалии означают, что день может начаться в другое время, например 01:00.0
.
К счастью, java.time имеет возможность определить первый момент дня, соответствующий определенному часовому поясу, LocalDate::atStartOfDay
.Давайте посмотрим на некоторый код, используя LocalDate
с именем today
и ZoneId
с именем zoneId
из кода выше.
ZonedDateTime todayStart = today.atStartOfDay( zoneId );
zdt: 2015-10-19T00: 00: 00-04:00 [Америка / Монреаль]
Совместимость
Если у вас должен быть java.util.Date для использования с классами, которые еще не обновлены для работы с типами java.time,перерабатывать.Вызовите метод java.util.Date.from( Instant instant )
.
java.util.Date date = java.util.Date.from( zdt.toInstant() );
О java.time
java.time Framework встроен в Java 8 и более поздние версии.Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .
Вы можете обмениваться java.time объектами непосредственно с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и больше .