PHP如何实现时长求和?使用Carbon库计算出现错误求助
解决Carbon时长求和返回错误结果的问题
我来帮你搞定这个问题,你遇到的核心问题是误用了Carbon的timestamp属性来计算时长总和——timestamp代表的是该日期时间距离1970-01-01 00:00:00 UTC的总秒数,本质是一个具体的时间点,而非你需要的“时长”。直接相加两个时间点的timestamp,得到的是一个远超实际时长的秒数,转成时间格式后自然会出现错误结果。
正确的解决方案
方案一:手动计算时长秒数(简单直接)
先把每个时间字符串转换成对应的总秒数,相加后再格式化为H:i:s格式:
// 辅助函数:将H:i:s格式的时间转成总秒数 function convertTimeToSeconds($timeStr) { list($hours, $minutes, $seconds) = explode(':', $timeStr); return (int)$hours * 3600 + (int)$minutes * 60 + (int)$seconds; } // 计算总秒数 $totalSeconds = convertTimeToSeconds('11:00:00') + convertTimeToSeconds('06:30:00'); // 转成H:i:s格式 $hours = floor($totalSeconds / 3600); $minutes = floor(($totalSeconds % 3600) / 60); $seconds = $totalSeconds % 60; $totalTime = sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds); echo $totalTime; // 输出:17:30:00
方案二:使用Carbon的时间间隔(CarbonInterval)功能
Carbon专门提供了CarbonInterval类来处理时长,更符合Carbon的使用习惯:
use Carbon\CarbonInterval; // 将时间字符串转成CarbonInterval对象 $interval1 = CarbonInterval::createFromFormat('H:i:s', '11:00:00'); $interval2 = CarbonInterval::createFromFormat('H:i:s', '06:30:00'); // 相加两个时间间隔 $totalInterval = $interval1->add($interval2); // 格式化输出总时长(注意要获取总小时数,而非模24的小时数) $totalTime = sprintf('%02d:%02d:%02d', (int)$totalInterval->totalHours(), $totalInterval->minutes, $totalInterval->seconds); echo $totalTime; // 输出:17:30:00
为什么你的原代码会出错?
当你用Carbon::createFromFormat('H:i:s', '11:00:00')创建实例时,Carbon会默认使用当前日期(比如今天2024-05-20)来补全日期部分,所以这个实例的timestamp是「今天11:00:00」对应的Unix秒数,另一个实例的timestamp是「今天06:30:00」对应的秒数。
两者相加后得到的秒数是两个具体时间点的秒数之和,这会指向一个遥远的未来时间(比如2080年的某个凌晨),而你用format('h:i:s')格式化时,只会显示这个未来时间的时分秒部分(12小时制),也就是你看到的05:30。
内容的提问来源于stack exchange,提问作者user3242861
相关产品推荐
相关产品推荐

