tl; др
11: 00 вечера до 7:30 утра = 7,5 или 8,0 или 8,5 или 9,5 или другое количество часов в зависимости от конкретных дат и часового пояса.
Duration.between(
ZonedDateTime.of( 2019 , 1 , 23 , 23 , 0 , 0 , 0 , ZoneId.of( "Africa/Cairo" ) ) ,
ZonedDateTime.of( 2019 , 1 , 24 , 7 , 30 , 0 , 0 , ZoneId.of( "Africa/Cairo" ) )
)
.toString()
См. Этот код, запущенный в режиме реального времени на IdeOne.com .
PT8H30M
Для расчета истекшего времени требуется дата,время суток и часовой пояс
Ответ Маркуса Гензеля движется в правильном направлении, но не учитывает такие аномалии, как переход на летнее время (DST).
Ваш вопрос не совсем понятен.Вы хотите отследить общее представление о времени суток, используя обычные 24-часовые дни?Или вы хотите отслеживать реальные моменты, например, время, в которое спал два дня назад, время, в котором спал вчера, и так далее?
Если последнее, то вы не можете использовать LocalDateDate
, так как этот класс по определению не может отслеживать моменты.В классе LocalDateTime
отсутствует понятие часового пояса или смещения от UTC.Таким образом, LocalDateTime
представляет потенциальных моментов в диапазоне около 26-27 часов (диапазон часовых поясов вокруг земного шара).
Учитывая ваш пример с 23:00 до 7:30, это будет означать 8,5 часов в определенном часовом поясе без аномалий на эту дату.Но в день перехода на летнее время это может означать 7,5 часов («весна впереди») или 9,5 часов («падение назад»).Или, может быть, 8,0 часов в день, например, в прошлом году, когда Северная Корея настроила свои часы на полчаса.Или когда в 2007 Венесуэла повернула время вспять на полчаса ... и затем десятилетие спустя снова перевернулась .Эти изменения происходят чаще, чем вы можете себе представить.Политики всего мира продемонстрировали склонность к пересмотру смещения их часового пояса.
shot В результате вы не можете надежно рассчитать прошедшее время, используя только время суток.Вы должны использовать дату и часовой пояс .
ZoneId
Указать правильное имя часового пояса в формате Continent/Region
например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.Никогда не используйте 2-4 буквенные сокращения, такие как EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime
Для отслеживания моментов используйте класс ZonedDateTime
.Этот класс объединяет дату, время суток и часовой пояс.
LocalDate ldStart = LocalDate.of( 2019 , 1 , 23 ) ;
LocalTime ldStart = LocalTime.of( 23 , 0 ) ;
ZonedDateTime zdtStart = ZonedDateTime.of( ldStart , ltStart , z ) ;
И время остановки.
LocalDate ldStop = LocalDate.of( 2019 , 1 , 24 ) ; // Next day.
LocalTime ldStop = LocalTime.of( 7 , 30 ) ;
ZonedDateTime zdtStop = ZonedDateTime.of( ldStop , ltStop , z ) ;
Рассчитать прошедшее время, используя Duration
класс.
Duration d = Duration.between( zdtStart , zdtStop ) ;
ISO 8601
Iрекомендуем не сообщать прошедшее время, используя формат времени дня, ЧЧ: ММ: СС.Вместо этого используйте стандартный формат , определенный для этой цели , в стандарте ISO 8601 .
Таким образом, 8,5 часов будут PT8H30M
.
Классы java.time используют форматы ISO 8601 по умолчанию при разборе / генерации строк.
String output = d.toString() ; // Generate `PT8H30M`.
И разбор.
Duration d = Duration.parse( "PT8H30M" ) ;
О 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
и more .