java.time
Вы используете ужасные старые классы даты и времени, которые были вытеснены несколько лет назад классами java.time , определенными в JSR 310 .
LocalDate
Сначала получите интересующую дату. Если вы хотите «сегодня», вы должны указать часовой пояс.
Класс LocalDate
представляет значение только для даты без времени суток и без часовой пояс или смещение от UTC .
Часовой пояс имеет решающее значение при определении даты. В любой момент времени дата меняется по всему земному шару в зависимости от зоны. Например, через несколько минут после полуночи в Париж Франция - это новый день, но все еще "вчера" в Монреаль Квебек .
Если часовой пояс не указан, JVM неявно применяет свой текущий часовой пояс по умолчанию. Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться. Лучше указать в качестве аргумента ваш желаемый / ожидаемый часовой пояс .
Укажите собственное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 2-4 буквенные сокращения, такие как EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
Если вы хотите использовать текущий часовой пояс JVM по умолчанию, запросите его и передайте в качестве аргумента. Если опущено, текущее значение по умолчанию JVM применяется неявно. Лучше быть явным, поскольку значение по умолчанию может быть изменено в любой момент во время выполнения любым кодом в любом потоке любого приложения в JVM.
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
Первый момент дня
с 12:00 до 12:00
День не всегда длится с 12 до 12 утра!
Никогда не предполагайте, когда день начинается или заканчивается. День не всегда длится 24 часа, это может быть 23, 23,5, 25 или любое другое количество часов, придуманное политиками, определяющими часовой пояс. В некоторых зонах в некоторые даты день может не начинаться в 00:00, он может начинаться в другое время, например 01:00. Пусть java.time определит, когда день начинается и заканчивается.
Half-Open
Как правило, лучший подход при определении промежутка времени - это подход Half-Open. В этом подходе начало включительно , а окончание исключительно . Это позволяет избежать проблем, связанных с попыткой точно определить долю секунды в конце дня. День начинается в первый момент одной даты и продолжается, но не включает первый момент следующей даты.
ZonedDateTime zdtStart = ld.atStartOfDay( z ) ; // First moment of the day as seen in the wall-clock time used by the people of a particular region as defined arbitrarily by their politicians (a time zone).
ZonedDateTime zdtStop = ld.plusDays( 1 ).atStartOfDay( 1 ) ; // First moment of the day of the *following* date.
Справочная дата эпохи и гранулярность
API Google для DataReadRequest.Builder::setTimeRange
учитывает некоторую степень детализации, начиная с некоторой контрольной даты эпохи . К сожалению, ни предел гранулярности, ни ссылка на эпоху не указаны - и существует много ссылок на эпоху .
Я возьму предположение за секунды, являющееся самой тонкой гранулярностью, и предположу, что в 1970-01-01T00: 00Z это ссылка на эпоху. Эта эпоха используется классами java.time и ужасным старым java.util.Date
классом.
long secondsSinceEpoch_Start = zdtStart.toEpochSecond() ;
long secondsSinceEpoch_Stop = zdtStop.toEpochSecond() ;
Сделайте звонок в API.
…
.setTimeRange(
secondsSinceEpoch_Start ,
secondsSinceEpoch_Stop ,
TimeUnit.SECONDS
)
…
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .
Чтобы узнать больше, см. Учебное пособие по Oracle . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где оbtain классы java.time?