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

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

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

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

作为后续工作,如果它确实有效,我假设将日期转换为时间戳并根据时间戳进行比较是更好的做法。将日期转换为时间戳的更好功能是:get_timestamp()还是strtotime()?

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

if ("2013-06-27"

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

if ("2013-06-29"

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

"我假设将日期转换为时间戳并根据时间戳进行比较是一种更好的实践"——为什么?我想不出这是真的原因。只要字符串日期的格式正确(YYYY-MM-DD或类似格式),就可以比较它们。为了回答你的一个问题,strtotime需要一个字符串,而get_timestamp需要一个DateTime对象。这要看情况而定。我发现自己很少使用DateTime对象,因为php有许多奇妙的函数,比如strtotime来处理日期字符串。

我假设在两个日期字符串上使用一个简单的小于或大于比较不是最佳实践,因为我看到的每个其他日期比较示例都首先将其转换为时间戳。如果您不需要转换它为时间戳,那么它看起来确实是一个额外的步骤。

很明显,因为如果你去掉标点符号,它们是…比如说numbers,你比较数字…

还有其他很好的理由可以转换为时间戳,例如执行计算(减去日期、添加/减去时间段)和处理时区问题。但这种比较特性是这种特殊的字符串表示在计算机应用程序中流行的原因之一。

值得一提的是,在上面的示例表达式中得到2014的原因是,当对字符串执行算术运算时,php会遍历字符串,查找传递ctype_digit()函数并在第一个非数字字符处停止的字符。因此,将上述日期转换为int返回2013,然后添加1,得到2014。

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

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

还要注意,这只在您使用YYYY-MM-DD格式时有效,如果您使用其他格式,它将不起作用。

谢谢你的回复。那么,从左到右的每个字符的比较是"词汇比较"的意思吗?

@彼得拉-一个老观点,但是的。注意,LTR(从左到右)语言中的数字在开始时用最高数量级的数字表示(例如,在单位之前的数百位)。时间通常也用这种方式表示。然而,大多数西方日期格式并不遵循这一习惯,其中一些(m/d/Y实际上并不遵循特定的数量级。这是根据ISO 8601修正的。对于未来比较的一般指导,我建议使用一个datetimeinterface类。

但是为什么-字符不干扰比较呢?这是因为它们在两个字符串中是相等的吗?

@比尔理查兹是的

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值