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

Laravel 10中日期组合比较结果异常问题求助

问题原因及解决办法

1. 运算符优先级踩坑

PHP 里赋值运算符 = 的优先级高于逻辑运算符 and,你写的代码:

$less3days = ($task->deadline_at->gte($today)) and ($task->deadline_at->lt($today->addDays(3)));

实际执行顺序是:

  • 先执行 $less3days = ($task->deadline_at->gte($today)),把 true 赋值给 $less3days
  • 后面的 and (...) 逻辑结果不会覆盖变量,所以最终 $less3days 是 true

解决:把 and 换成 &&,&& 的优先级高于 =,会先执行两边的逻辑判断再赋值:

$less3days = ($task->deadline_at->gte($today)) && ($task->deadline_at->lt($today->addDays(3)));

2. Carbon 对象的可变特性(额外隐藏坑)

Carbon 是可变对象,调用 $today->addDays(3) 会直接修改 $today 本身的值。你单独测试时调用了一次 addDays(3),此时 $today 已经变成了 2024-07-18,后面赋值时再调用 addDays(3),$today 会变成 2024-07-21,直接篡改了逻辑判断的基准日期。

解决:调用 copy() 方法创建副本再修改,避免污染原对象:

$less3days = ($task->deadline_at->gte($today)) && ($task->deadline_at->lt($today->copy()->addDays(3)));

最终修正后的代码

dump($today);    // 2024-07-15 00:00:00.0 UTC (+00:00)
dump($task->deadline_at); // 2024-08-03 00:00:00.0 UTC (+00:00)

dump($task->deadline_at->gte($today)); // true
dump($task->deadline_at->lt($today->copy()->addDays(3))); // false

$less3days = ($task->deadline_at->gte($today)) && ($task->deadline_at->lt($today->copy()->addDays(3)));
dump($task->id);
dd($less3days); // 输出 false,符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:50:02