If 语句使用日期和 strtotime 返回错误结果

If statement returning false result using date and strtotime

我正在尝试使用 if 语句来表示“如果今天在两个日期之间,则执行此操作...”等等

它不工作,我完全不知所措,因为据我所知 - 它应该工作!

if (date('d/m/y', strtotime('now')) >= date('d/m/y', strtotime('1 January 2021')) && date('d/m/y', strtotime('now')) <= date('d/m/y', strtotime('31 January 2021'))):
    echo 'true';
else:
    echo 'false';
endif;

今天是 2020 年 12 月 3 日 - 为什么它告诉我这句话是真的?

PS。如果我将其更改为 > 30th December 2020< 1st February 2021 中的任何一个,或者同时更改为 < 1st February 2021,它确实有效 - 但我很谨慎地这样做,以防它只是一个小故障并且我犯了一个明显的编码错误。

用以下代码替换您的代码。

if (strtotime(date('d/m/y', strtotime('now'))) >= strtotime(date('d/m/y', strtotime('1 January 2021'))) && strtotime(date('d/m/y', strtotime('now'))) <= strtotime(date('d/m/y', strtotime('31 January 2021')))):
    echo 'true';
else:
    echo 'false';
endif;

首先。现在不是 12 月 3 日,而是 12 月 1 日。

您遇到的问题是因为您正在尝试比较字符串。
Date() returns 字符串,据我所知,没有一种编程语言可以正确地(无论在此上下文中的正确含义是什么)将 > 或 < 与字符串进行比较。它是 === 或 !==.

所以在比较中使用 Unix 时间,因为它是数字并且更容易被计算机理解。

$now = strtotime('now');
$start = strtotime('1 January 2021');
$end = strtotime('31 January 2021');

if ($now >= $start && $now <= $end):
    echo 'true';
else:
    echo 'false';
endif;

https://3v4l.org/KAvQ2

date('d/m/y') 给你一个像 30/11/20 这样的字符串。比较这种格式的日期实际上意味着你在比较字符串,只有当日期是 YYYYMMDD(或 YYYY-MM-DD)格式时才有效。

只用strtotime()将类英文日期转成Unix时间戳(只是一个大整数)直接比较就容易多了:

if ( 
    strtotime('now') >= strtotime('1 January 2021')
        &&
    strtotime('now') <= strtotime('31 January 2021')
) {
    echo 'true';
} else {
    echo 'false';
}

您确实应该使用 DateTime class 进行所有与日期相关的计算。不要使用旧的 strtotime()date() 除非你真的知道你在做什么。

有了DateTime class就很简单了:

<?php

$start = new DateTime('1 January 2021');
$end = new DateTime('31 January 2021');
$today = new DateTime();
if($today >= $start && $today <= $end){
    echo 'In between';
} else {
    echo 'outside or range';
}

Demo