You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:36:03