PHP计算两个时钟时间差跨凌晨场景结果错误如何解决?
根因分析
DateTime::createFromFormat仅传入时分、上下午标识时,会默认将两个时间归属为同一天。你示例中的5PM(当日17:00)和1AM(当日01:00)做差值计算时,得到的是当日01:00到17:00的反向差值16小时,而非跨天到次日01:00的8小时。
另外原代码拼接时间字符串时,时分和上下午标识之间缺少空格,不符合g:i A的格式要求,可能导致DateTime::createFromFormat创建失败返回false,修复时需要同步补上。
修复方案
计算差值前先判断两个时间的时间戳大小,如果下班时间戳小于上班时间戳,说明跨了凌晨,给下班时间追加1天再计算差值即可。
修复后的代码如下:
$x = ':'; $hour1 = '5'; $minute1 = '00'; $meridiem1 = 'PM'; $hour2 = '1'; $minute2 = '00'; $meridiem2 = 'AM'; // 补上时分和上下午之间的空格,匹配格式要求 $timein = $hour1.$x.$minute1.' '.$meridiem1; $timeout = $hour2.$x.$minute2.' '.$meridiem2; $a = DateTime::createFromFormat( 'g:i A', $timein ); $b = DateTime::createFromFormat( 'g:i A', $timeout ); // 新增跨天判断逻辑 if ($b->getTimestamp() < $a->getTimestamp()) { $b->modify('+1 day'); } $interval = $a->diff($b); $interval_hour = $interval->h; $interval_minute = $interval->m; echo 'Employee'.'<br>'; echo 'Time in: '.$timein.' '.'<br>'; echo 'Time out: '.$timeout.' '.'<br>'; echo 'Total: '.$interval_hour.' h'.' & '.$interval_minute.' m'.'<br>';
如果存在超过1天的跨天场景(比如连续上班超过24小时),可以根据业务规则调整加天的逻辑,普通日常打卡场景下加1天即可覆盖所有跨凌晨的情况。
内容的提问来源于stack exchange,提问作者newbie_java_student101
相关产品推荐
相关产品推荐

