Как рассчитать разницу между двумя временами

Я хочу рассчитать время сна пользователя, он должен ввести, когда он спал и когда он проснулся, и я должен рассчитать, сколько часов он спал

Например, если пользователь вводит

His sleeping time : 11:00 pm

His waking up time : 7:30 am

The number of sleeping hours should be : 8:30 hrs

Есть ли способ сделать этот расчет легко

это код

cal.set(Calendar.HOUR_OF_DAY, 11);
        cal.set(Calendar.MINUTE, 0);
        sleepTimeOnOffDays = cal.getTime();

    private long subtractTwoDates(Date date1, Date date2) {

            Calendar calendar1 = Calendar.getInstance();
            Calendar calendar2 = Calendar.getInstance();
            calendar1.setTime(date1);
            calendar2.setTime(date2);
            long milsecs1 = calendar1.getTimeInMillis();
            long milsecs2 = calendar2.getTimeInMillis();
            long diff = milsecs2 - milsecs1;
            long dhours = diff / (60 * 60 * 1000);

            return Math.abs(dhours);
        }

покажите нам, что вы пробовали до сих пор ..

DarShan 27.01.2019 14:41

пожалуйста, проверьте еще раз

Amira Elsayed Ismail 27.01.2019 14:45

Я думаю, что то, что вы сделали, довольно близко. Вопрос только в том, что ваш алгоритм будет возвращать полные часы, а не минуты и т. д. Если вам нужны минуты и т. д., вам следует создать новый объект Date из разницы, и это даст вам часы, минуты и секунды.

Vinay Avasthi 27.01.2019 15:00

но он всегда возвращает неправильные значения, он возвращает 8:54 вместо 8:30, и я не знаю, почему?

Amira Elsayed Ismail 27.01.2019 15:06

Возможный дубликат Как мне получить разницу между двумя датами в Android?, попробовал все и опубликовал и другие вопросы. Пожалуйста, поищите, прежде чем задавать вопрос.

Ole V.V. 27.01.2019 17:43

Будет проще, если вы используете java.time, я предлагаю класс Duration. Кроме того, ваш код выглядит правильно, есть ли проблема? Не могли бы вы создать минимальный, полный и проверяемый пример показать, как вы получаете 8:54 вместо 8:30, потому что я не могу сразу понять, как ваш код может это сделать?

Ole V.V. 27.01.2019 17:52

К вашему сведению, проблемные старые классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleDateFormat, теперь являются устаревшими, вытесненными классами Java.время. Большая часть функциональности Java.время обратно перенесена на Java 6 и Java 7 в проекте ThreeTen-Backport. Дальнейшая адаптация для более ранних версий Android (<26) в тридесятьABP. См. Как использовать ThreeTenABP….

Basil Bourque 27.01.2019 22:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
7
991
3

Ответы 3

Вы можете использовать SimpleDateFormat для получения входных данных. Я использую предопределенный ввод, так как вы хотели вычислить разницу между двумя заданными временами. Вот код для вас. Обратите внимание, что я дал ответ как для 24-часового, так и для 12-часового формата.

Получение значения времени сна и времени пробуждения

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
Date sleepingTime = simpleDateFormat.parse("22:00");
Date wakeUptime = simpleDateFormat.parse("07:00");

Для разницы меньше нуля это происходит в 12 часовом формате

long difference = sleepingTime.getTime() - wakeUpTime.getTime(); 
if (difference<0) {
  Date dateMax = simpleDateFormat.parse("24:00");
  Date dateMin = simpleDateFormat.parse("00:00");
  difference=(dateMax.getTime() -sleepingTime.getTime() )+(wakeUpTime.getTime()- 
  dateMin.getTime());
}

Расчет разницы

//days and minutes are optional
int days = (int) (difference / (1000*60*60*24));  
int hours = (int) ((difference - (1000*60*60*24*days)) / (1000*60*60)); 
int min = (int) (difference - (1000*60*60*24*days) - (1000*60*60*hours)) / 
(1000*60);
Log.e("log_tag",hours+" hours"); 

Я надеюсь, что это ответит на ваш запрос. Спасибо :)

Я попробую и вернусь к вам

Amira Elsayed Ismail 27.01.2019 18:05

нет не работает, печатает 15 часов должно быть 8:30

Amira Elsayed Ismail 27.01.2019 18:06

К вашему сведению, проблемные старые классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleDateFormat, теперь являются устаревшими, вытесненными классами Java.время. Большая часть функциональности Java.время обратно перенесена на Java 6 и Java 7 в проекте ThreeTen-Backport. Дальнейшая адаптация для более ранних версий Android (<26) в тридесятьABP. См. Как использовать ThreeTenABP….

Basil Bourque 27.01.2019 22:44

Просто попробуйте следующую строку кода, чтобы получить разницу в минутах

import java.util.concurrent.TimeUnit; // predefined method from java 6.

  private long subtractTwoDates(Date date1, Date date2) {
    Long diffInMinutes=null,diff=null;  // just  declaration of variables
    diff = date1.getTime() - date2.getTime();
    diffInMinutes= TimeUnit.MILLISECONDS.toMinutes(diff);
    log.info("diff min : "+difInMin); 
    return  diffInMinutes; // returns long value in minutes.
}

Начиная с Java SE 8, я хотел бы предложить использовать API Java.время. Для пользователей Android java.time добавляется в API 26+.

В Java 8 представлены новые API для даты и времени, чтобы устранить недостатки старых java.util.Date и java.util.Calendar.

Использование API java.time для расчета продолжительности между двумя датами очень просто.

LocalDateTime localDateTime1 = LocalDateTime.now();
localDateTime1 = localDateTime1.withHour(23).withMinute(0).withSecond(0).withNano(0);

LocalDateTime localDateTime2 = LocalDateTime.now();
localDateTime2 = localDateTime2.plusDays(1).withHour(7).withMinute(30).withSecond(0).withNano(0);

Duration diff = Duration.between(localDateTime1, localDateTime2);

String hms = String.format("%d:%02d:%02d", 
                 diff.toHoursPart(),
                 diff.toMinutesPart(), 
                 diff.toSecondsPart());
System.out.println(hms);

-----------------------

Console output:
8:30:00

Если API java.time недоступен для вашего проекта, потому что, например, ваш проект еще не находится на уровне API 26, я бы рекомендовал использовать API Бэкпорт ThreeTen для Android, предложенный @Ole VV в комментариях ниже.

Синтаксис почти такой же, как у java.time API. Приведенный выше фрагмент кода работает и для ThreeTen Android Backport API (как уже упоминалось @Basil Bourque) за одним исключением. Класс Duration API ThreeTen Android Backport, к сожалению, не предоставляет вспомогательных методов для извлечения части часов, минут и т. д. из объекта продолжительности. Вместо этого, когда вы используете бэкпорт, вам нужно сначала вычесть часы, а затем минуты из продолжительности, чтобы остались только секунды:

long hours = diff.toHours();
diff = diff.minusHours(hours);
long minutes = diff.toMinutes();
diff = diff.minusMinutes(minutes);
long seconds = diff.getSeconds();
String hms = String.format("%d:%02d:%02d", 
                 hours,
                 minutes, 
                 seconds);

Другое отличие заключается в том, что вам необходимо импортировать классы java.time из пакета org.threeten.bp (а не из пакета java.time).

Если вы хотите использовать API-интерфейс ThreeTen Backport, просто включите его зависимость в свой проект.

Хорошее предложение. Только если вы еще не на уровне API 26, я предлагаю ThreeTenABP, бэкпорт java.time вместо Joda-Time.

Ole V.V. 27.01.2019 17:48

к сожалению, моя текущая версия API — 21 :(

Amira Elsayed Ismail 27.01.2019 17:59

@ОлеВ.В. не могли бы вы привести пример его использования или документацию

Amira Elsayed Ismail 27.01.2019 18:00

@AmiraElsayedIsmail Бэк-порт имеет практически тот же API, что и Java.время. Когда вы в конечном итоге мигрируете с обратного порта, вам нужно будет сделать немного больше, чем изменить свои операторы import. Таким образом, приведенный здесь пример кода остается прежним при использовании обратного порта.

Basil Bourque 27.01.2019 19:02

Конечно, @AmiraElsayedIsmail. Пример: мой ответ здесь. Документация: Учебник по Oracle. документация по API. Пожалуйста, найдите больше.

Ole V.V. 27.01.2019 19:23

Вы не можете надежно рассчитать прошедшее время между моментами, используя класс LocalDateTime. Для этого расчета требуется дата, время суток и часовой пояс. Подробнее см. в мой ответ.

Basil Bourque 27.01.2019 22:29

Другие вопросы по теме