Я хочу рассчитать время сна пользователя, он должен ввести, когда он спал и когда он проснулся, и я должен рассчитать, сколько часов он спал
Например, если пользователь вводит
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);
}
пожалуйста, проверьте еще раз
Я думаю, что то, что вы сделали, довольно близко. Вопрос только в том, что ваш алгоритм будет возвращать полные часы, а не минуты и т. д. Если вам нужны минуты и т. д., вам следует создать новый объект Date из разницы, и это даст вам часы, минуты и секунды.
но он всегда возвращает неправильные значения, он возвращает 8:54 вместо 8:30, и я не знаю, почему?
Возможный дубликат Как мне получить разницу между двумя датами в Android?, попробовал все и опубликовал и другие вопросы. Пожалуйста, поищите, прежде чем задавать вопрос.
Будет проще, если вы используете java.time, я предлагаю класс Duration. Кроме того, ваш код выглядит правильно, есть ли проблема? Не могли бы вы создать минимальный, полный и проверяемый пример показать, как вы получаете 8:54 вместо 8:30, потому что я не могу сразу понять, как ваш код может это сделать?
К вашему сведению, проблемные старые классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleDateFormat, теперь являются устаревшими, вытесненными классами Java.время. Большая часть функциональности Java.время обратно перенесена на Java 6 и Java 7 в проекте ThreeTen-Backport. Дальнейшая адаптация для более ранних версий Android (<26) в тридесятьABP. См. Как использовать ThreeTenABP….




Вы можете использовать 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");
Я надеюсь, что это ответит на ваш запрос. Спасибо :)
Я попробую и вернусь к вам
нет не работает, печатает 15 часов должно быть 8:30
К вашему сведению, проблемные старые классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleDateFormat, теперь являются устаревшими, вытесненными классами Java.время. Большая часть функциональности Java.время обратно перенесена на Java 6 и Java 7 в проекте ThreeTen-Backport. Дальнейшая адаптация для более ранних версий Android (<26) в тридесятьABP. См. Как использовать ThreeTenABP….
Просто попробуйте следующую строку кода, чтобы получить разницу в минутах
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.
к сожалению, моя текущая версия API — 21 :(
@ОлеВ.В. не могли бы вы привести пример его использования или документацию
@AmiraElsayedIsmail Бэк-порт имеет практически тот же API, что и Java.время. Когда вы в конечном итоге мигрируете с обратного порта, вам нужно будет сделать немного больше, чем изменить свои операторы import. Таким образом, приведенный здесь пример кода остается прежним при использовании обратного порта.
Конечно, @AmiraElsayedIsmail. Пример: мой ответ здесь. Документация: Учебник по Oracle. документация по API. Пожалуйста, найдите больше.
Вы не можете надежно рассчитать прошедшее время между моментами, используя класс LocalDateTime. Для этого расчета требуется дата, время суток и часовой пояс. Подробнее см. в мой ответ.
покажите нам, что вы пробовали до сих пор ..