我在尝试比较 PHP 代码中的日期时遇到了意外结果。这就是我正在做的:
<?php
$date = Carbon::now()->locale('fr_FR');
$date->subMonth();
$previousMonth = ucfirst($date->monthName) . ' ' . $date->year;
$currentDate = Carbon::now()->locale('fr_FR');
$currentDate->firstOfMonth();
$firstDayOfPreviousMonth = $currentDate->subMonth()->firstOfMonth(); // "2024-02-01"
$lastDayOfPreviousMonth = $firstDayOfPreviousMonth->copy()->lastOfMonth(); // "2024-02-29"
$carbonSubmissionTime = Carbon::createFromTimestamp(1709216823); // "2024-02-29"
if ($carbonSubmissionTime->gte($firstDayOfPreviousMonth) && $carbonSubmissionTime->lte($lastDayOfPreviousMonth)) {
echo "ok";
}else{
echo "nok";
}
您可以在以下位置测试代码:https://play.phpsandbox.io/embed/nesbot/carbon
期望收到“ok”,因为“2024-02-29”落在“2024-02-01”和“2024-02-29”的范围内。然而,实际结果是“nok”。
什么可能导致这种差异?
编辑
我也尝试使用
betweenIncluded
但给出了相同的结果:
if($carbonSubmissionTime->betweenIncluded($firstDayOfPreviousMonth, $lastDayOfPreviousMonth)){}
差异来自于以下事实:
$carbonSubmissionTime
也有时间成分,其中 $lastDayOfPreviousMonth
的时间设置为 00:00:00
。
如果我们在比较之前添加以下调试语句,问题就很明显了:
echo "The submission time is ", $carbonSubmissionTime->toDateTimeString(), "\n";
echo "First day of previous month is ", $firstDayOfPreviousMonth->toDateTimeString(), "\n";
echo "Last day of previous month is ", $lastDayOfPreviousMonth->toDateTimeString(), "\n";
这产生:
提交时间为2024-02-29 14:27:03
上个月的第一天是 2024-02-01 00:00:00
上个月最后一天是 2024-02-29 00:00:00
要么将上个月的最后一天更改为 23:59:59,要么将时间归零,如下所示:
$carbonSubmissionTime = $carbonSubmissionTime->startOfDay(); // "2024-02-29 00:00:00"
进行这些更改中的任何一个都会产生所需的输出。