我有一个小时选择下拉0-23
和分钟选择下拉0-59
分别为Start time
和End time
(所以四个控件)。算法需要两次计算差异
我正在寻找一种算法来计算使用这四个值的时间差。
由于它们没有存储在精美的日期/时间选择控件中,我不认为我可以使用任何标准的日期/时间操作函数。
如何计算两次之间的差异?
我有一个小时选择下拉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)
感谢帕克斯 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
是的,在一个数学系统中有一些数学能力:-)在两个小时内从5:50到8:30以及_forty_分钟。两个小时从5点50分到7点50分,10分钟到8点,30分钟到8点半。十和三十分钟,而不是五十分钟。我不确定这个坚持是从哪里来的,是2:50的持续时间。有什么我们失踪了吗? – paxdiablo 2010-08-19 06:13:49
paxdiablo, 不,你不会错过任何东西。不过我在想我为什么把50 ..出事了我的数学智力.. – Rishi 2010-08-19 06:32:10
首先,你需要检查是否结束时间大于或等于开始时间来防止任何问题。为此,您首先检查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,测试)。将这两者合在一起,你应该全部设置好。
感谢阿伦。可你确认我在演示正确, 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
我的意思是增加分钟的差异,但留下负号。所以30-50 = -20 ... m = 60 + -20 = 40。或者你可以减去绝对值:D – 2010-08-19 05:54:20
亚伦,谢谢..但它仍然会到2:40,但正确的应该是2 :50:P – Rishi 2010-08-19 06:00:37
$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;
这将计算在几分钟时间,包括一年因素
//* 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
简单的公式应该有所帮助:
mindiff = 60 + endtime.min - starttime.min
hrdiff = ((mindiff/60) - 1) + endtime.hr - starttime.hr
这给你以小时为单位的持续时间和分钟
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");
如果你有一个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);
哼道:没那么简单,如果你要考虑到闰秒天文学家都热衷于投入,不时。
“所以没有语言或脚本可以使用” - 什么? – 2010-08-19 04:57:58
似乎它会回到笔和纸,然后... X-) – 2010-08-19 04:58:52
不,不好意思,不知道。 – griegs 2010-08-19 04:59:20