为什么在“YYYY-MM-DD”的日期格式中,两个字符串的PHP中的比较小于或者多于比较,即使它们是字符串?

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字符串的小于/大于比较的示例代码:

1
2
3
4
5
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字符串的数值的示例代码

1
2
3
4
5
6
$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类比较日期。这使得它更容易理解,而且你不必处理类型杂耍。