Laravel8中Carbon的between方法判断日期区间返回false原因排查
问题根因
- Carbon 实例默认是可变对象,你调用
$today->addDays($fullcalendar_nearest_days)方法时,会直接修改原$today实例的值,而非仅返回修改后的新实例,你的代码实际执行逻辑如下:- 初始
$today赋值为2021-06-29 00:00:00 - 执行
$today->addDays($fullcalendar_nearest_days)时,原$today本身被修改为2021-07-02 00:00:00,再将这个值赋值给$expireDateCheckNearest - 最终调用
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
相关产品推荐
相关产品推荐

