为什么在PHP中对日期格式为“0”的两个字符串进行小于或大于的比较;YYYY-MM-DD”;即使它们是字符串也能工作


Why does a less than or more than comparison in PHP of two strings in the date format of "YYYY-MM-DD" work even though they are strings?

我正在为一个项目编写一段PHP代码,该代码将YYYY-MM-DD格式的日期与当前日期进行比较,看看它是否小于当前日期。在代码的不同点,使用了两种不同的方法进行比较。第一个在日期上使用get_timestamp(),并根据时间戳进行比较。在另一个地方,它只是将日期字符串与date("Y-m-d")的输出进行比较。我的预期是,两个日期字符串的比较不会提供正确的响应。然而,当我设置了几个测试用例时,我得到了预期的输出。我查阅了PHP手册的两个部分以获得见解,但我仍然困惑于为什么在不转换为时间戳的情况下进行比较。

PHP手册的比较运算符部分指出,字符串要么被转换为数字,然后进行数字比较,要么进行所谓的词汇比较。我找不到任何关于词汇比较的进一步内容,但当我读到关于字符串转换为数字的文章,并尝试使用日期字符串的例子时,我尝试的每个日期字符串都会得到相同的数字输出。

有人能帮我理解为什么两个日期字符串的大于或小于比较有效(或者至少看起来有效)吗?我错过了什么?

作为后续行动,如果它真的有效,我认为将日期转换为时间戳并根据时间戳进行比较是更好的做法。将日期转换为时间戳时使用哪个函数更好:get_timestamp()还是strtotime()

两个YYYY-MM-DD字符串的小于/大于比较示例代码:

if ("2013-06-27" < "2013-06-28") { echo "less"; } // Output: less
if ("2013-06-27" > "2013-06-28") { echo "more"; } // Output: (none)
if ("2013-06-29" < "2013-06-28") { echo "less"; } // Output: (none)
if ("2013-06-29" > "2013-06-28") { echo "more"; } // Output: more

测试转换YYYY-MM-DD字符串的数值的示例代码

$foo = 1 + "2013-06-27";
echo "'$foo==$foo"; // Output: $foo = 2014
$foo = 1 + "2013-06-28";
echo "'$foo==$foo"; // Output: $foo = 2014
$foo = 1 + "2013-06-29";
echo "'$foo==$foo"; // Output: $foo = 2014

当你用这种方式比较一个字符串时,它会从左到右,比较给定字符串中的每个字符,看看它们是否不同,直到它发现差异,然后它会通过比较最后一个字符的ASCII值来决定哪个字符串更大。巧合的是,由于您只使用数字,ASCII表中的最高数字也更高。

只要你在比较中只使用数字,并且每个字符串都有相同数量的字符,这个解决方案就会起作用

还要注意,这只适用于使用YYYY-MM-DD格式的情况,如果使用其他格式,它将不起作用。

使用DateTime类比较日期。它使它更容易理解,而且你不必处理类型杂耍。