Feature, а не ошибка.
Вы неадекватно используете класс времени-времени для представления значения времени суток. Кроме того, вы используете неприятные старые классы date-time, теперь устаревшие, вытесненные классами java.time.
Используйте класс LocalTime
для значения только по времени суток, без даты и без часового пояса или смещения.
LocalTime lt = LocalTime.of("22:15") ;
Вы можете сделать математику, используя Duration
класс.
Duration d = Duration.of(startLocalTime , stopLocalTime);
Уловка с использованием значения времени суток обтекает часы, переходя через полночь. Без контекста дат, как вы могли рассчитывать на правильный результат? Начиная с «22:15» до «01:15» вы хотели бросить на следующий день, на следующую неделю или на следующий год?
Класс Duration
принимает подход, не пересекая полночь. Диапазон значений для LocalTime
составляет в общей сложности 24 часа, начиная от minimum от 00:00
до maximum от 23:59:59.999999999
. Таким образом, единственный способ перейти от более позднего времени к более раннему времени - это перемещаться назад во времени к более ранней точке, в результате чего получается отрицательное число.
LocalTime start = LocalTime.parse ("22:15");
LocalTime stop = LocalTime.parse ("01:15");
Duration d = Duration.between (start , stop);
Дамп для консоли.
System.out.println ("start/stop: " + start + "/" + stop);
System.out.println ("d.toString(): " + d);
старт/стоп: 22: 15/01: 15
d.toString(): ПТ-21Н
Этот выход является стандартным ISO 8601 format for durations.
Если вы хотите рассчитать промежутки времени между фактическими моментами на временной шкале, поиск переполнения стека для java.time
, Duration
, Period
, ZonedDateTime
, ZoneId
, OffsetDateTime
, Instant
, Interval
и «прошло». Эта тема была освещена много раз уже.
В качестве примера можно привести некоторые произвольные даты, начинающиеся с 23 по 24 апреля текущего года в зоне America/Montreal
. Результат - три часа прошедшего времени. Этот результат может отличаться от по дате и зоне из-за аномалий, таких как Daylight Saving Time (DST).
ZoneId z = ZoneId.of("America/Montreal") ;
ZonedDateTime zdtStart = ZonedDateTime.of(2017, 1, 23, 22, 15, 0, 0 , z);
ZonedDateTime zdtStop = ZonedDateTime.of(2017, 1, 24, 01, 15, 0, 0 , z);
Duration d = Duration.between(zdtStart , zdtStop);
zdtStart.toString(): 2017-01-23T22: 15-05: 00 [Америка/Монреаль]
zdtStop.toString(): 2017-01-24T01: 15-05 : 00 [Америка/Монреаль]
d.toString(): PT3H
Смотрите, code run live at IdeOne.com.
О java.time
java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.
Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.
Где получить классы java.time?
- Java SE 8 и SE 9, а затем
- Встроенный.
- Часть стандартного Java API с объединенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
- Android
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more.
Почему вы предполагаете, что существует разница в день?/Эти часы в тот же день? –
Если вы всегда хотите наименьшее возможное расстояние между ними (игнорируя даты), это будет меньше этого значения и 24 - это значение. –
Да, это разница в день. Но я хочу узнать, сколько часов занимает промежуток между часами 1 и часом 2 – SerKleanthis