Ответ 1
ТЛ; др
Duration // Span of time, with resolution of nanoseconds.
.between( // Calculate elapsed time.
LocalTime.now( // Get current time-of-day…
ZoneId.of( "Pacific/Auckland" ) // … as seen in a particular time zone.
) // Returns a 'LocalTime' object.
,
myJavaUtilDate // Avoid terrible legacy date-time classes such as 'java.util.Date'.
.toInstant() // Convert from 'java.util.Date' to 'java.time.Instant', both representing a moment in UTC.
.atZone( // Adjust from UTC to a particular time zone. Same moment, same point on the timeline, different wall-clock time.
ZoneId.of( "Pacific/Auckland" ) // Specify time zone by proper naming in 'Continent/Region' format, never 2-4 letter pseudo-zones such as 'PST', 'CEST', 'CST', 'IST', etc.
) // Returns a 'ZonedDateTime' object.
.toLocalTime() // Extract the time-of-day without the date and without a time zone.
) // Returns a 'Duration' object.
.toMillis() // Calculate entire span-of-time in milliseconds. Beware of data-loss as 'Instant' uses a finer resolution the milliseconds, and may carry microseconds or nanoseconds.
Я предлагаю обойти типобезопасный и не требующий пояснений объект Duration
, а не просто целое число миллисекунд.
java.time
Современный подход использует классы java.time, которые вытеснили ужасные унаследованные классы, такие как Date
, Calendar
, SimpleDateFormat
.
Преобразуйте ваш java.util.Date
(мгновение в UTC) в Instant
. Используйте новые методы преобразования, добавленные к старым классам.
Instant instant = myJavaUtilDate.toInstant() ;
Это представляет момент в UTC. Для определения даты и времени суток требуется часовой пояс. В любой момент дата и время варьируются по всему земному шару в зависимости от зоны. Например, через несколько минут после полуночи в Париже Франция - это новый день, который все еще "вчера" в Монреале-Квебеке.
Если часовой пояс не указан, JVM неявно применяет свой текущий часовой пояс по умолчанию. Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться. Лучше указать в качестве аргумента желаемый/ожидаемый часовой пояс.
Укажите правильное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 2-4-буквенное сокращение, такое как EST
или IST
, поскольку они не являются истинными часовыми поясами, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Если вы хотите использовать текущий часовой пояс по умолчанию для JVM, запросите его и передайте в качестве аргумента. Если опущено, текущее значение по умолчанию для JVM применяется неявно. Лучше быть явным, поскольку значение по умолчанию может быть изменено в любой момент во время выполнения любым кодом в любом потоке любого приложения в JVM.
ZoneId z = ZoneId.systemDefault() ; // Get JVMs current default time zone.
Назначьте ZoneId
Instant
для создания объекта ZonedDateTime
.
ZonedDateTime zdt = instant.atZone( z ) ;
Извлеките часть времени суток без даты и без часового пояса.
LocalTime lt = zdt.toLocalTime() ;
сравнения. Подсчитайте прошедшее время с помощью Duration
.
Duration d = Duration.between( ltStart , ltStop ) ;
Имейте в виду, что это несправедливое сравнение. Дни не всегда продолжительностью 24 часа, и не все значения времени суток действительны для всех дней во всех зонах. Например, в Соединенных Штатах во время перехода на летнее время может не быть часа 2 часа вообще. Таким образом, с 1 до 4 часов утра может быть 3 часа в одну дату, но только 2 часа в другую дату.
О 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.*
.
Где взять классы java.time?
- Java SE 8, Java SE 9, Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с встроенной реализацией ,
- Java 9 добавляет некоторые мелкие функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функциональности java.time перенесена на Java 6 & 7 в ThreeTen-Backport.
- Android
- Более поздние версии Android связывают реализации классов java.time.
- Для более ранних версий Android (& lt; 26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянуто выше). Смотрите Как использовать ThreeTenABP....
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и еще more.