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
相关产品推荐
相关产品推荐

