PHP中如何将字符串时长转为Interval并实现时长减法运算
嘿,我来帮你理清楚这两个问题:
问题解答
1. $worked_hrs_today 是 DateTime 对象还是 DateInterval?
当你调用 $usr_stamp_in->diff($usr_stamp_out) 时,返回的结果绝对是 DateInterval 对象,而非 DateTime。因为 DateTime::diff() 方法的核心作用就是计算两个 DateTime 实例之间的时间间隔,它的返回值类型固定为 DateInterval。你看到的 07:18 其实是这个 DateInterval 对象被格式化后的输出(比如通过 format('%H:%i') 方法得到的)。
2. 如何将字符串格式的时长转为 DateInterval 并完成减法计算?
你拿到的 $shift_break 是 00:30:00 这种字符串时长,不需要用 new DateTime(),直接用 DateInterval::createFromFormat() 就能把它转成 DateInterval 对象。不过要注意:DateInterval 本身没有直接的减法方法,我们可以通过两种方式实现你要的计算:
方法一:转成总秒数计算后再转回 DateInterval
// 1. 将字符串转成 DateInterval $shift_break_interval = DateInterval::createFromFormat('H:i:s', $shift_data['break']); // 2. 封装一个方法,把 DateInterval 转成总秒数 function dateIntervalToSeconds($interval) { return $interval->days * 86400 + $interval->h * 3600 + $interval->i * 60 + $interval->s; } $worked_seconds = dateIntervalToSeconds($worked_hrs_today); $break_seconds = dateIntervalToSeconds($shift_break_interval); // 3. 计算剩余秒数并转成 DateInterval $remaining_seconds = $worked_seconds - $break_seconds; $remaining_interval = new DateInterval('PT' . $remaining_seconds . 'S'); // 格式化输出结果 echo $remaining_interval->format('%H:%i'); // 输出 06:48
方法二:借助基准 DateTime 间接计算
这种方法更直观,利用 DateTime 的加减操作来实现间隔的减法:
// 1. 转换字符串为 DateInterval $shift_break_interval = DateInterval::createFromFormat('H:i:s', $shift_data['break']); // 2. 创建一个基准时间(比如当天0点,随便选一个固定时间即可) $base_time = new DateTime('today'); // 3. 基准时间先加工作时长,再减去休息时长 $base_time->add($worked_hrs_today); $base_time->sub($shift_break_interval); // 4. 和初始基准时间做diff,得到最终的有效工作时长间隔 $actual_worked_interval = (new DateTime('today'))->diff($base_time); // 格式化输出 echo $actual_worked_interval->format('%H:%i'); // 输出 06:48
两种方法都能得到你想要的 06:48 结果,你可以根据自己的代码场景选择更合适的一种。
内容的提问来源于stack exchange,提问作者Björn C
相关产品推荐
相关产品推荐

