Мне нужно сравнить (фактически ранжировать / сортировать) даты в скрипте PHP. Датами являются формат даты ISO-8601, т.е.
YYYY-MM-DD
Я написал функцию сравнения, которая разбивает даты и сравнивает их по году / месяцу / дню. Однако, похоже, это может быть излишним, и я мог бы так же легко сделать простое сравнение строк, как:
if ($date1 < $date2) // do something elseif( $date1 > $date2) //do something else else //do yet another thing
Является ли мое предположение относительно корректного сравнения строк даты (ISO-8601) корректным – то есть я могу избавиться от своей функции (чтобы сохранить несколько тактовых циклов на сервере), или это более безопасно для объяснения сравнения в пользовательской функции?
http://en.wikipedia.org/wiki/ISO_8601#General_principles
Значения даты и времени организованы от самых маленьких до наименее значимых: год, месяц (или неделя), день, час, минута, секунда и доля секунды. Таким образом, лексикографический порядок представления соответствует хронологическому порядку, за исключением представлений о датах с отрицательными годами. Это позволяет естественным образом сортировать даты, например, файловыми системами.
Продолжайте сортировку строк. Если википедии недостаточно, то, безусловно, http://www.ietf.org/rfc/rfc3339.txt , ищите там strcmp.
Если вы вернете даты в объекты DateTime
(обычно доступные с PHP 5.2+), вы можете надежно использовать сравнения независимо от формата.
$date = new DateTime("YYYY-MM-DD"); $date2 = new DateTime("YYYY-MM-DD"); if ($date > $date2) .....
Если у вас две даты в формате 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%
Проверить источник здесь .
Если у вас есть хотя бы PHP 5.2, я бы рекомендовал ответить Пекке . Если это не вариант, вы можете преобразовать дату в число и сравнить ее численно:
if(strtotime('YYYY-MM-DD') > strtotime('YYYY-MM-DD')) { // code }
Редактировать:
Как отмечал Мэрлин в комментариях, эпоха Unix имеет ограниченный диапазон. Если вы гарантированно имеете нули перед 1-значным месяцем и датами, вы также можете использовать strcmp
:
if(strcmp('2011-05-04', '2011-04-05') > 0) { // First date is larger }