我有一个小时选择下拉0-23
,分钟选择下拉0-59
分别为Start time
和End time
(所以四个控件)。
我正在寻找一种使用这四个值来计算时差的算法。
由于它们没有存储在花哨的日期/时间选择控件中,我认为我不能使用任何标准的日期/时间操作函数。
如何计算两次之间的差异?
答案 0 :(得分:13)
这个伪代码为您提供算法,以分钟计算差异。
假设如果开始时间在结束时间之后,则开始时间实际上是在前一天。
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 :(得分: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 :(得分: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,测试)。 Concat这两个在一起,你应该全部设置。
答案 3 :(得分: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;
答案 4 :(得分:0)
简单的等式应该有所帮助:
mindiff = 60 + endtime.min - starttime.min
hrdiff = ((mindiff/60) - 1) + endtime.hr - starttime.hr
答案 5 :(得分: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");
答案 6 :(得分: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);
嗯:如果你不得不考虑到天文学家不时希望投入的闰秒,那就不那么简单了。