2017-02-01 6 views
0

Я хочу рассчитать продолжительность между часами.Найти время между часами

SimpleDateFormat defaultFormat = new SimpleDateFormat("HH:mm"); 
Date hour1 = defaultFormat.parse(time1); 
Date hour2 = defaultFormat.parse(time2); 
duration = (time2.getTime() - time1.getTime())/(1000*60); //to minutes 
/* hours= duration/60 (hours) minutes = duration%60 (minutes) 

Особенно проблема возникает, если, например, час1 является «22:15», а hour2 - «01:15». Вышеприведенный фрагмент кода сохраняет значение «duration = 1260» (21 час).

Как я могу найти разницу между двумя часами без ошибок?

+0

Почему вы предполагаете, что существует разница в день?/Эти часы в тот же день? –

+0

Если вы всегда хотите наименьшее возможное расстояние между ними (игнорируя даты), это будет меньше этого значения и 24 - это значение. –

+0

Да, это разница в день. Но я хочу узнать, сколько часов занимает промежуток между часами 1 и часом 2 – SerKleanthis

ответ

0

Учтите, что вы можете нажать дату перехода на летнее время, а затем разницу между 23:00 и 3:00 может составлять 4, 3 или 5 часов. я предлагаю вам с помощью JodaTime Duration и Period классов в Java 7 или similar API in Java 8

0

Я предлагаю вам использовать Joda-Time, когда дело доходит до манипулировать даты и время в Android, или любое другое приложение Java. Он намного мощнее, чем родной Java-класс даты.

Вот пример использования Joda-Time:

DateTime startTime; 
DateTime endTime; 
Period p = new Period(startTime, endTime); 
int hours = p.getHours(); 
int minutes = p.getMinutes(); 
+1

FYI, проект [Joda-Time] (http://www.joda.org/joda-time/) теперь находится в [режиме обслуживания] (https://en.wikipedia.org/wiki/Maintenance_mode), с командой, предлагающей переход на [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary .html), встроенные в Java 8 и более поздние версии. Большая часть функций java.time была перенесена на Java 6 и 7 в [ThreeTen-Backport] (http://www.threeten.org/threetenbp/) и далее адаптирована для Android в [ThreeTenABP] (https: // github.com/JakeWharton/ThreeTenABP). –

+0

Благодарим вас за эту информацию. – DustyMan

1

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.