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

PHP Carbon:时差小于24小时跨天如何让diffInDays返回1?

解决Carbon diffInDays跨天但不足24小时返回0的问题

你有两个跨天但间隔小于24小时的日期:

  • $end => 2022-09-07 02:20:47
  • $now => 2022-09-06 16:00:00

使用Carbon的diffInDays方法时,无论调用顺序如何都返回0:

$diffDays = $end->diffInDays($now, false); // 返回0
$diffDays = $now->diffInDays($end, false); // 返回0

这是因为diffInDays默认按完整24小时周期计算天数差,不足24小时的间隔会被判定为0天。要实现"跨天即算1天"的需求,可采用以下几种方案:

方案1:用diffInDaysFiltered自定义过滤逻辑

通过自定义过滤函数,只要两个日期不在同一天,就计为1天:

$diffDays = $end->diffInDaysFiltered(function (Carbon $date) use ($now) {
    return $date->toDateString() !== $now->toDateString();
}, $now);
// 执行后返回1

方案2:截断时间后计算日期差

将两个日期的时间部分截断到当天起始点,再计算天数差:

$diffDays = $end->startOfDay()->diffInDays($now->startOfDay(), false);
// 执行后返回1

也可以先提取日期字符串再实例化Carbon对象计算:

$endDate = Carbon::parse($end->toDateString());
$nowDate = Carbon::parse($now->toDateString());
$diffDays = $endDate->diffInDays($nowDate, false);
// 同样返回1

方案3:直接对比日期字符串

如果仅需判断是否跨天并返回1或0,可直接对比日期字符串:

$diffDays = $end->toDateString() !== $now->toDateString() ? 1 : 0;

内容的提问来源于stack exchange,提问作者PHP User

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:20:31