You need to enable JavaScript to run this app. Laravel8中Carbon的between方法判断日期区间返回false原因排查
优惠活动
大模型
产品
解决方案
定价
更多

Laravel8中Carbon的between方法判断日期区间返回false原因排查

问题根因
  • Carbon 实例默认是可变对象,你调用$today->addDays($fullcalendar_nearest_days)方法时,会直接修改原$today实例的值,而非仅返回修改后的新实例,你的代码实际执行逻辑如下:
    1. 初始$today赋值为2021-06-29 00:00:00
    2. 执行$today->addDays($fullcalendar_nearest_days)时,原$today本身被修改为2021-07-02 00:00:00,再将这个值赋值给$expireDateCheckNearest
    3. 最终调用between()方法时,传入的区间实际为2021-07-02 ~ 2021-07-02,2021-06-30不在该区间内,因此返回false
修复方案

你可以通过两种方式避免原实例被修改的问题:

方案1:使用不可变Carbon实例

使用CarbonImmutable替代默认的Carbon,所有日期修改操作都会返回新实例,不会改动原对象:

$today = CarbonImmutable::today()->startOfDay();
$expireDateCheckNearest = $today->addDays($fullcalendar_nearest_days)->startOfDay();
$is_fullcalendar_nearest_days = $adItem->expire_date->between($today, $expireDateCheckNearest);

方案2:修改前先复制原实例

调用copy()方法复制原$today实例后再做日期计算,不会影响原对象的值:

$today = Carbon::today()->startOfDay();
// 先复制再修改,避免改动原$today
$expireDateCheckNearest = $today->copy()->addDays($fullcalendar_nearest_days)->startOfDay();
$is_fullcalendar_nearest_days = $adItem->expire_date->between($today, $expireDateCheckNearest);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 12:27:03