2010-08-19 98 views
0

我有一个小时选择下拉0-23和分钟选择下拉0-59分别为Start timeEnd time(所以四个控件)。算法需要两次计算差异

我正在寻找一种算法来计算使用这四个值的时间差。

由于它们没有存储在精美的日期/时间选择控件中,我不认为我可以使用任何标准的日期/时间操作函数。

如何计算两次之间的差异?

+7

“所以没有语言或脚本可以使用” - 什么? – 2010-08-19 04:57:58

+2

似乎它会回到笔和纸,然后... X-) – 2010-08-19 04:58:52

+1

不,不好意思,不知道。 – griegs 2010-08-19 04:59:20

回答

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

感谢帕克斯 T1 = 5:50 T2 = 8:30 startx的= 5 * 60 + 50 = 350 endx = 8 * 60 + 30 = 510 持续时间= 510-350 = 160 = 2小时40分钟正确应该是2小时50分钟 我错过了什么吗? – Rishi 2010-08-19 06:05:06

+3

是的,在一个数学系统中有一些数学能力:-)在两个小时内从5:50到8:30以及_forty_分钟。两个小时从5点50分到7点50分,10分钟到8点,30分钟到8点半。十和三十分钟,而不是五十分钟。我不确定这个坚持是从哪里来的,是2:50的持续时间。有什么我们失踪了吗? – paxdiablo 2010-08-19 06:13:49

+0

paxdiablo, 不,你不会错过任何东西。不过我在想我为什么把50 ..出事了我的数学智力.. – Rishi 2010-08-19 06:32:10

0

首先,你需要检查是否结束时间大于或等于开始时间来防止任何问题。为此,您首先检查End_Time_Hour是否大于Start_Time_Hour。如果它们相等,则会检查End_Time_Min是否大于或等于Start_Time_Min。 接下来,您将从End_Time_Hour中减去Start_Time_Hour。然后你会从End_Time_Min中减去Start_Time_Min。如果分钟的差值小于0,则将小时差值减1,并将分钟差值加到60(或59,测试)。将这两者合在一起,你应该全部设置好。

+0

感谢阿伦。可你确认我在演示正确, T1 = 5:50 T2 = 8:30 H = 8 - 5 = 3 M = 30-50 = -20 由于m是小于0,因此, H = 3-1 = 2 现在加上微小差异为60, 米= 60 + 20 = 80 结果,2:80? – Rishi 2010-08-19 05:51:43

+0

我的意思是增加分钟的差异,但留下负号。所以30-50 = -20 ... m = 60 + -20 = 40。或者你可以减去绝对值:D – 2010-08-19 05:54:20

+0

亚伦,谢谢..但它仍然会到2:40,但正确的应该是2 :50:P – Rishi 2010-08-19 06:00:37

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

如果你有一个func它返回自开始日期以来的天数(例如, 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); 

哼道:没那么简单,如果你要考虑到闰秒天文学家都热衷于投入,不时。