8

我正在为一个项目编写一段 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
4

2 回答 2

14

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

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

另请注意,这仅在您使用 YYYY-MM-DD 格式时才有效,如果您使用其他格式,它将无法正常工作。

于 2013-06-28T19:01:04.290 回答
2

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

于 2013-10-10T17:43:08.333 回答