我需要在PHP脚本中比较(实际排名/排序)日期。日期是ISO-8601日期格式,即
YYYY-MM-DD
我写了一个比较函数,它分割日期并按年/月/日进行比较。但是,这似乎有点矫枉过正,我可以轻松完成一个简单的字符串比较,如:
if ($date1 < $date2)
// do something
elseif( $date1 > $date2)
//do something else
else
//do yet another thing
我的假设(ISO-8601)日期字符串比较是否正确 - 即我可以摆脱我的功能(在服务器上保存几个时钟周期),还是明确更安全在自定义函数中进行比较?
答案 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
}