Вопрос:
У меня есть выделение часа 0-23 и выпадающий список минут 0-59 для Start time и End time соответственно (так что четыре элемента управления).
Я ищу алгоритм для вычисления разницы во времени с использованием этих четырех значений.
Так как они не хранятся в элементарных элементах выбора даты/времени, я не думаю, что могу использовать любые стандартные функции обработки даты/времени.
Как рассчитать разницу между двумя раз?
Лучший ответ:
Этот псевдокод дает вам алгоритм для определения разницы в минутах.
Он предполагает, что, если время начала после окончания времени, время начала было фактически в предыдущий день.
startx = starthour * 60 + startminute endx = endhour * 60 + endminute duration = endx — startx if duration < 0: duration = duration + 1440
Значения startx и endx – это количество минут с полуночи.
Это в основном делает:
- Получить количество минут от начала дня для начала.
- Получить количество минут от начала дня до конца.
- Вычтите первое из последнего.
- Если результат отрицательный, добавьте количество минут в день.
Не уверен, что вы не можете использовать функции манипуляции с датой и временем. Вы можете обнаружить, что вы можете легко построить дату/время и рассчитать различия с чем-то вроде:
DateTime startx = new DateTime (1, 1, 2010, starthour, startminute, 0); DateTime endx = new DateTime (1, 1, 2010, endhour , endminute , 0); Integer duration = DateTime.DiffSecs(endx, startx) / 60; if (duration < 0) duration = duration + 1440;
хотя он, вероятно, не нужен для вашего простого сценария. Я бы придерживался псевдокода, который я дал выше, если вы не обнаружите, что делаете некоторые хитрое манипулирование датой/временем.
Если вы хотите увеличить продолжительность (в минутах) на часы и минуты:
durHours = int(duration / 60) durMinutes = duration % 60 // could also use duration — (durHours * 60) Ответ №1
Это рассчитает продолжительность в минутах, включая год как фактор
//* Assumptions: Date is in Julian Format startx = starthour * 60 + startminute endx = endhour * 60 + endminute duration = endx — startx if duration <= 0: duration = duration + 1440 end-if if currday > prevday duration = duration + ((currday-preday) — 1 * 1440) end-if Ответ №2
Сначала вам нужно проверить, не превышает ли время окончания время начала, чтобы предотвратить возникновение каких-либо проблем. Для этого сначала проверьте, больше ли значение End_Time_Hour, чем Start_Time_Hour. Если они равны, вы должны проверить, будет ли End_Time_Min больше или равно Start_Time_Min.
Затем вы вычитаете Start_Time_Hour из End_Time_Hour. Затем вы вычитаете Start_Time_Min из End_Time_Min. Если разница минут меньше 0, вы уменьшаете часовую разницу на единицу и добавляете разницу минут до 60 (или 59, проверьте это). Соедините эти два вместе, и вы должны быть настроены.
Ответ №3$start_time_hr = 5; $start_time_mi = 50; $end_time_hr = 8; $end_time_mi = 30; $diff = (($end_time_hr*60)+$end_time_mi) — (($start_time_hr*60)+$start_time_mi); $diff_hr = (int)($diff / 60); $diff_mi = (int)($diff) — ($diff_hr*60); echo $diff_hr . ‘:’ . $diff_mi; Ответ №4
простое уравнение должно помочь:
mindiff = 60 + endtime.min — starttime.min hrdiff = ((mindiff/60) — 1) + endtime.hr — starttime.hr Ответ №5
Это дает вам продолжительность в часах и минутах
h1 = «hora1» m1 «min1» h2 «hora2» m2 = «min2» if ( m1 > m2) { h3 = (h2 — h1) — 1; } else { h3 = h2 — h1; } m1 = 60 — m1; if (m1 + m2 >= 60) { m3 = 60 — (m1 + m2); } else if (m3 < 0) { m3 = m3 * -1; } else { m3 = m1 + m2; } System.out.println(«duration:» + h3 + «h» + m3 + «min»); Ответ №6
Если у вас есть функция, которая возвращает количество дней с даты начала (например, dayssince1900), вы можете просто конвертировать обе даты в секунды с этой даты начала, сделать ABS (d1-d2), а затем преобразовать секунды назад формат, который вы хотите, например HHHH: ММ: СС
Простой, например,
SecondsSince1900(d) { return dayssince1900(d)*86400 +hours(d)*3600 +minutes(d)*60 +seconds(d); } diff = ABS(SecondsSince1900(d1)-SecondsSince1900(d2)) return format(diff DIV 3600)+’:’+format((diff DIV 60) MOD 60)+’:’+format(diff MOD 60);
Hum: Не так просто, если вам нужно учитывать секунды прыжка, которые астрономы очень хотят время от времени вставлять.