Laravel计算与上一条日志created_at时间差时如何正确实现分钟取整
问题偏差根因
之前取整结果不符合预期的核心是取整操作的时机错位:
- 原始计算流程是:秒级时间差换算为小时单位 → 减去小时单位的喂养间隔 → 对小时维度的差值做小数取整 → 乘以60换算为分钟
- 这种流程下,小时维度的取整粒度最低是6分钟(若保留1位小数,0.1小时=6分钟),比如实际计算得到的10.2分钟差值,对应的小时值是0.17小时,在小时维度取1位小数就会被进位为0.2小时,换算后就是12分钟,完全偏离“最终分钟取整为整数”的目标
正确修正方案
将取整操作挪到所有单位换算完成、得到最终分钟级数值之后执行,保证取整粒度和需求的分钟级匹配。
对应的feed类型分支修改后代码:
if($type == 'feed'){ // 1. 完成基础计算,全程不在中间环节做取整 // $diffTime 此时已经是换算为小时单位的原始时间差 $diffHour = $diffTime - $baby->feedingInterval; $diffMinuteFloat = $diffHour * 60; // 得到浮点型的分钟差值 // 2. 在分钟维度做整数取整 // 适配“10.2m转10m”的需求,使用round四舍五入;若需直接舍去小数保留整数可用floor() $diffMinute = (int)round($diffMinuteFloat, 0); // 3. 拼接正负标识和显示格式 $logDetailStatus = ($diffMinute > 0) ? "+" : "-"; $diffTime = $logDetailStatus . abs($diffMinute) . "m "; }
额外优化提示:原代码用
str_replace('-', '', $diffTime)处理负号的方式有隐患,替换过程会误改数值本身的内容,后续扩展到小时级差值时可能出现异常,用abs()直接取数值绝对值的方式更稳定。
内容的提问来源于stack exchange,提问作者code-8
相关产品推荐
相关产品推荐

