比较PHP中的两个ISO8601日期字符串

时间:2011-02-23 22:47:02

标签: php

我需要在PHP脚本中比较(实际排名/排序)日期。日期是ISO-8601日期格式,即

YYYY-MM-DD

我写了一个比较函数,它分割日期并按年/月/日进行比较。但是,这似乎有点矫枉过正,我可以轻松完成一个简单的字符串比较,如:

if ($date1 < $date2)
   // do something
elseif( $date1 > $date2)
   //do something else
else
   //do yet another thing

我的假设(ISO-8601)日期字符串比较是否正确 - 即我可以摆脱我的功能(在服务器上保存几个时钟周期),还是明确更安全在自定义函数中进行比较?

4 个答案:

答案 0 :(得分:20)

http://en.wikipedia.org/wiki/ISO_8601#General_principles

  

日期和时间值的组织从最重要到最不重要:年,月(或周),日,小时,分钟,秒和秒的分数。因此,表示的字典顺序对应于时间顺序,除了涉及负年份的日期表示。这允许日期自然地按例如文件系统排序。

继续进行字符串排序。如果维基百科还不够,那么肯定是http://www.ietf.org/rfc/rfc3339.txt,在那里搜索strcmp。

答案 1 :(得分:8)

如果您将日期转换为DateTime objects(通常可从PHP 5.2+获得),您可以可靠地使用比较,无论格式如何。

$date = new DateTime("YYYY-MM-DD");
$date2 = new DateTime("YYYY-MM-DD");

if ($date > $date2)  .....

答案 2 :(得分:3)

如果您有两个ISO 8601格式的日期,那么,是的,您可以将它们作为字符串进行比较。此解决方案具有最佳性能:

Test name       Repeats         Result          Performance     
string          10000           0.031393 sec    +0.00%
strcmp          10000           0.040579 sec    -29.26%
strtotime       10000           0.149791 sec    -377.15%
DateTime        10000           0.184489 sec    -487.68%

测试来源here

答案 3 :(得分:2)

如果您的PHP至少为5.2,我建议Pekka's answer。如果这不是一个选项,您可以将日期转换为数字并进行数字比较:

if(strtotime('YYYY-MM-DD') > strtotime('YYYY-MM-DD'))
{
   // code
}

编辑:

正如Maerlyn在评论中指出的那样,Unix时代的范围有限。如果您保证在1位数月份和日期前面有零,您也可以使用strcmp

if(strcmp('2011-05-04', '2011-04-05') > 0)
{
   // First date is larger
}
相关问题