算法需要计算两次之间的差异

时间:2010-08-19 04:55:03

标签: algorithm datetime time

我有一个小时选择下拉0-23,分钟选择下拉0-59分别为Start timeEnd time(所以四个控件)。

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

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

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

7 个答案:

答案 0 :(得分:13)

这个伪代码为您提供算法,以分钟计算差异。

假设如果开始时间在结束时间之后,则开始时间实际上是在前一天。

startx = starthour * 60 + startminute
endx = endhour * 60 + endminute
duration = endx - startx
if duration < 0:
    duration = duration + 1440

startxendx值是自午夜以来的分钟数。

这基本上是这样做的:

  • 从开始时间开始,获取分钟数。
  • 从结束时间开始,获取分钟数。
  • 从后者中减去前者。
  • 如果结果为负,请在一天内添加分钟数。

尽管您不能使用日期/时间操作功能,但不要太确定。您可能会发现您可以轻松地构建日期/时间并使用以下内容计算差异:

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);
嗯:如果你不得不考虑到天文学家不时希望投入的闰秒,那就不那么简单了。