在Laravel或PHP中如何根据打卡时间计算用户使用软件时长
实现方案
Laravel自带Carbon时间处理库,无需额外安装扩展即可满足需求,同时兼容跨天使用(例:当日23:00签到到次日01:20签退)的场景。
基础代码实现
你可以选择在对应模型中新增访问器,或者单独封装工具函数处理时长计算,示例如下:
首先引入Carbon命名空间:use Carbon\Carbon;
// 入参支持带AM/PM的12小时制时间格式 function calculateUsageDuration(string $clockInTime, string $clockOutTime): string { // 异常情况校验 if (empty($clockInTime) || empty($clockOutTime)) { return '时间数据异常'; } // 将字符串时间转为Carbon实例 $in = Carbon::createFromFormat('h:i A', $clockInTime); $out = Carbon::createFromFormat('h:i A', $clockOutTime); // 签退时间早于签到时间时判定为跨天,给签退时间加1天 if ($out->lessThan($in)) { $out->addDay(); } // 计算时间差 $diff = $in->diff($out); $hours = $diff->h; $minutes = $diff->i; // 拼接返回格式 $result = []; if ($hours > 0) { $result[] = $hours . ' ' . ($hours === 1 ? 'hour' : 'hours'); } if ($minutes > 0) { $result[] = $minutes . ' ' . ($minutes === 1 ? 'minute' : 'minutes'); } return implode(' & ', $result); }
测试验证
用你给出的示例测试调用:dd(calculateUsageDuration('5:00 PM', '6:10 PM'));
输出结果为1 hour & 10 minutes,完全匹配需求。
适配调整说明
- 如果你从Python拿到的是24小时制时间(例:
17:00、18:10),只需要把createFromFormat方法的第一个参数改为'H:i'即可。 - 如果后续需要做时长统计,建议把计算结果转成总分钟数的整数格式存入数据库,展示时再做格式转换,统计效率更高。
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

