尽管包含目标日期,日期范围比较仍出现意外输出

问题描述 投票:0回答:1

我在尝试比较 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)){}
php php-carbon
1个回答
0
投票

差异来自于以下事实:

$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"

进行这些更改中的任何一个都会产生所需的输出。

© www.soinside.com 2019 - 2024. All rights reserved.