这是我永远无法工作的一件事.
我的问题是检测一天的结束和下一天的开始,然后将差异分成每一天.
想象一下,你想要计算工资率,但它必须跨越午夜.
它也适用于计算在定时系统上运行的时间,或它应该运行的时间差.
我更喜欢在Unix Epoch中记录所有时间,就像它一样简单
hoursWorked = ((stopTime - startTime)/60)/60
这是一个完整的解决方案,它在PHP中,但应该很容易构建到任何语言:
date2epoch($startTime[0])) { $minutesWorked1 = (59 - $startTime[1][1]); //Calculate how many minutes have occured from begining of shift to midnight $minutesWorked2 = $endTime[1][1]; //Number of minute from midnight to end of shift $hoursWorked1 = (23 - $startTime[1][0]);//Number of hours from start of shift to midnight $hoursWorked2 = $endTime[1][0];//Number of minutes from midnight to end of shift echo 'Before midnight you worked ' . $hoursWorked1 . ':' . $minutesWorked1 . "\nAfter midnight you worked " . $hoursWorked2 . ':' . $minutesWorked2 . '.'; } else { //SOMETHING MAJOR BAD HAS HAPPENED WHILE LOGGING THE CLOCKINS AND CLOCKOUTS } } else { echo 'Today you worked ' . ($endTime[1][0] - $startTime[1][0]) . ':' . ($endTime[1][1] - $startTime[1][1]); } function date2epoch($date, $format='m/d/Y') { $date = split('/', $date); return mktime('0', '0', '0', $date[0], $date[1], $date[2]); } ?>
在系统中,这显然是一个微不足道的问题,其中起始和结束时间是包含日期和时间的数据结构.但是有很多系统没有这样做.计时系统常常有一条包含日期,开始时间和结束时间的记录.在这种情况下,问题不那么重要.
我想,有两个问题你要问:
如何判断时间跨度是否超过午夜?
如果时间跨度超过午夜,第一天发生了多少时间,第二天发生了多少时间?
第一个问题很容易回答:如果结束时间在开始时间之前,则时间跨度已经过了午夜.
如果是这种情况,那么您有两个要计算的金额.日期发生的时间跨度是从开始时间到午夜之间的时间.下一个日期发生的时间跨度是午夜和结束时间之间的时间(即结束时间).