Алгоритм, необходимый для расчета разницы между двумя - PullRequest
1 голос
/ 19 августа 2010

У меня есть выпадающий список выбора часов 0-23 и выпадающий список выбора минут 0-59 для Start time и End time соответственно (четыре элемента управления).

Я ищу алгоритм для расчета разницы во времени, используя эти четыре значения.

Поскольку они не хранятся в причудливых элементах управления датой / временем, я не думаю, что смогу использовать какие-либо стандартные функции манипуляции с датой / временем.

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

Ответы [ 7 ]

13 голосов
/ 19 августа 2010

Этот псевдокод дает вам алгоритм для расчета разницы в минутах.

Предполагается, что, если время начала находится после времени окончания, время начала фактически было в предыдущий день.

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 голос
/ 03 апреля 2011

Это вычислит продолжительность в минутах, включая год как фактор

//* 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
0 голосов
/ 21 декабря 2015

Если у вас есть функция, которая возвращает количество дней с некоторой начальной даты (например, dayssince1900), вы можете просто конвертировать обе даты в секунды с этой начальной даты, выполните ABS (d1-d2), а затем конвертируйте секунды обратно в любую формат, который вы хотите, например, HHHH: MM: SS

Простой, например.

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);

Жужжание: не так просто, если вам нужно учитывать високосные секунды, которые астрономы время от времени стремятся вводить.

0 голосов
/ 08 июля 2013

Это дает вам продолжительность в часах и минутах

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");
0 голосов
/ 16 августа 2011

простое уравнение должно помочь:

mindiff = 60 + endtime.min - starttime.min
hrdiff  = ((mindiff/60) - 1) + endtime.hr - starttime.hr 
0 голосов
/ 19 августа 2010
$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;
0 голосов
/ 19 августа 2010

Сначала вам необходимо проверить, больше ли время окончания или равно времени начала, чтобы избежать каких-либо проблем. Для этого сначала проверьте, больше ли 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, проверьте это). Соедините их вместе, и все будет готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...