2010-08-19 4 views
0

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

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

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

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

+7

«так что язык и сценарий не могут быть использованы» - что? –

+2

Кажется, он вернется к ручке и бумаге тогда ... X-) –

+1

Нет, извините, не знаю. – griegs

ответ

10

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

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

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) 
+0

Благодаря Pax, Т1 = 5: 50 Т2 = 8: 30 StartX = 5 * 60 + 50 = 350 EndX = 8 * 60 + 30 = 510 длительность = 510- 350 = 160 = 2 часа 40 минут правильная должна быть 2 часа 50 минут Я ничего не пропустил? – Rishi

+3

Да, некоторые математические способности в сексуальной системе :-) С 5:50 до 8:30 через два часа и через минуту. Два часа вы берете с 5:50 до 7:50, от десяти минут до 8:00, а затем от 30 минут до 8:30. Десять и тридцать сорок минут, а не пятьдесят. Я не уверен, откуда эта настойчивость исходит из того, что это 2:50. Что-то не пропало? – paxdiablo

+0

paxdiablo, Нет, вы ничего не пропустили. Тем не менее я думаю, почему я поставил 50 .. Что-то пошло не так с моим математическим интеллектом .. – Rishi

0

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

+0

Спасибо Аарон .Can вы подтверждаете, что я правильно демонстрирует, T1 = 5:50 T2 = 8: 30 ч = 8 - 5 = 3 м = 30-50 = -20 , так как т меньше, чем 0, так, ч = 3-1 = 2 теперь добавить разницу минут до 60, м = 60 + 20 = 80 результат, 2:80? – Rishi

+0

Я имел в виду добавить разницу минут, но оставил отрицательный знак. Итак, 30-50 = -20 ... m = 60 + -20 = 40. Или вы можете просто вычесть абсолютное значение: D –

+0

Аарон, спасибо .. но он все равно придет 2:40, но правильный должен быть 2 : 50: P – Rishi

0
$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; 
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 
1

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

mindiff = 60 + endtime.min - starttime.min 
hrdiff = ((mindiff/60) - 1) + endtime.hr - starttime.hr 
0

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

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

Если у вас есть функция который возвращает количество дней с даты начала (например, 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); 

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

Смежные вопросы