Carbon日期范围比较异常:目标日期在区间却返回nok
问题原因及解决方案
核心原因
你遇到的问题本质是时间部分的比较被忽略:
- 调用
firstOfMonth()时,Carbon默认会将时间设置为00:00:00,所以$firstDayOfPreviousMonth的值是2024-02-01 00:00:00。 - 随后调用
copy()->lastOfMonth(),lastOfMonth()默认参数也是00:00:00,因此$lastDayOfPreviousMonth实际是2024-02-29 00:00:00。 - 而你的
$carbonSubmissionTime对应的是2024-02-29 10:27:03(UTC时区),这个时间晚于2024-02-29 00:00:00,导致lte()判断不成立,最终输出nok。
修复方案
你需要把上月最后一天的时间设置为当日的结束时刻,有两种简单方式:
方式1:使用endOfMonth()方法
endOfMonth()会直接将时间设置为当月最后一天的23:59:59.999999,完美覆盖当日所有时间点:
$lastDayOfPreviousMonth = $firstDayOfPreviousMonth->copy()->endOfMonth();
方式2:给lastOfMonth()指定时间参数
手动传入23:59:59作为lastOfMonth()的参数,将时间设置为当日最后一秒:
$lastDayOfPreviousMonth = $firstDayOfPreviousMonth->copy()->lastOfMonth('23:59:59');
修改后,$lastDayOfPreviousMonth会变成2024-02-29 23:59:59(或更精确的毫秒级结束时间),此时$carbonSubmissionTime的10:27:03会满足区间条件,输出ok。
另外,如果你使用betweenIncluded()或between($start, $end, true),只要边界时间设置正确,也能得到预期结果。
内容的提问来源于stack exchange,提问作者executable
相关产品推荐
相关产品推荐

