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

Pet*_*erA 8 php date string-comparison comparison-operators

我正在为一个项目的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
Run Code Online (Sandbox Code Playgroud)

示例代码测试转换后的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
Run Code Online (Sandbox Code Playgroud)

Dan*_*ssy 11

当你用这种方式比较字符串时,它将从左到右,并比较给定字符串中的每个字符以查看它们是否不同,直到找到差异,然后它将通过比较ASCII值来决定哪个字符串更大最后一个角色.巧合的是,由于您只使用数字,因此ASCII表上的最高数字也更高.

只要您在比较中仅使用数字,并且每个字符串具有相同的字符数,此解决方案就会起作用

另请注意,这仅适用于您使用YYYY-MM-DD格式,如果您使用其他格式则无法使用.