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;
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';
}
我正在尝试使用 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;
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';
}