如何用Carbon计算日期差,获取整数天数、小时数与分钟数?
问题
用Carbon计算两个日期差时,diffInDays()返回的是浮点数(比如测试用例里的19.404166666667),强行转int会触发“Implicit conversion from float ... loses precision”的废弃警告。需要用Carbon原生方法拿到整数的天数、小时数、分钟数,不能用浮点数凑结果。
测试用的日期:
- 起始:
2024-07-01 10:00:00 - 结束:
2024-07-20 19:42:00
原来的代码逻辑存在问题,依赖浮点数转int会触发警告:
$dateStart = Carbon::parse($dateStart); $dateEnd = Carbon::parse($dateEnd); if ($dateStart && $dateEnd) { $days = $dateStart->diffInDays($dateEnd); // 返回浮点数 $hours = $dateStart->diffInHours($dateEnd) % 24; // 结果正确但整体逻辑依赖浮点数转换告警 return [ "days" => $days, "hours" => $hours, ]; }
解法1:用diff()获取DateInterval直接拆分
Carbon的diff()方法返回DateInterval对象,里面直接存储整数格式的天、小时、分钟,完全避免浮点数问题:
$dateStart = Carbon::parse('2024-07-01 10:00:00'); $dateEnd = Carbon::parse('2024-07-20 19:42:00'); if ($dateStart && $dateEnd) { $diff = $dateStart->diff($dateEnd); return [ 'days' => (int) $diff->d, // 19 'hours' => (int) $diff->h, // 9 'minutes' => (int) $diff->i, // 42 ]; }
解法2:分步使用精准差值方法
先获取完整的整数天数,再基于该时间点计算剩余的小时和分钟,每一步都用Carbon原生方法保证整数结果:
$dateStart = Carbon::parse('2024-07-01 10:00:00'); $dateEnd = Carbon::parse('2024-07-20 19:42:00'); if ($dateStart && $dateEnd) { // 只取完整的整数天数 $days = $dateStart->diffInDays($dateEnd, false); // 19 // 将起始日期往后推完整天数,得到剩余时间的起始点 $remainingStart = $dateStart->copy()->addDays($days); // 计算剩余的小时数 $hours = $remainingStart->diffInHours($dateEnd, false); // 9 // 再推小时,计算剩余分钟数 $remainingStartAfterHours = $remainingStart->copy()->addHours($hours); $minutes = $remainingStartAfterHours->diffInMinutes($dateEnd, false); // 42 return [ 'days' => $days, 'hours' => $hours, 'minutes' => $minutes, ]; }
两种解法的优势
- 解法1最简洁,一步获取所有整数单位,完全规避浮点数相关警告。
- 解法2适合需要分步处理剩余时间的场景,每一步都是精准的整数计算。
内容的提问来源于stack exchange,提问作者winnie damayo
相关产品推荐
相关产品推荐

