Подтвердить что ты не робот

Сравнение двух строк даты ISO8601 в PHP

Мне нужно сравнить даты фактического ранжирования/сортировки в PHP script. Датами являются формат даты ISO-8601, т.е.

YYYY-MM-DD

Я написал функцию сравнения, которая разбивает даты и сравнивает их по году/месяцу/дню. Однако, похоже, это может быть излишним, и я мог бы так же легко выполнить простое сравнение строк, например:

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

Я полагаю, что мое предположение (ISO-8601) корректно сопоставляется с строкой даты - то есть я могу избавиться от своей функции (чтобы сохранить несколько тактовых циклов на сервере), или это более безопасно для объяснения сравнения в пользовательской функции

4b9b3361

Ответ 1

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

Значения даты и времени организованы от наиболее значимых: год, месяц (или неделя), день, час, минута, секунда и доля секунды. Таким образом, лексикографический порядок представления соответствует хронологическому порядку, за исключением представлений о датах с отрицательными годами. Это позволяет естественным образом сортировать даты, например файловые системы.

Продолжайте сортировку строк. Если wikipedia недостаточно, то, безусловно, http://www.ietf.org/rfc/rfc3339.txt, найдите там strcmp.

Ответ 2

Если вы включите свои даты в DateTime объекты (обычно доступны из PHP 5.2+), вы можете надежно использовать сравнения независимо от формата.

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

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

Ответ 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%

Источник тестирования здесь.

Ответ 4

Если у вас есть хотя бы PHP 5.2, я бы рекомендовал ответ Pekka. Если это не вариант, вы можете преобразовать дату в число и сравнить ее численно:

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

Edit:

Как отмечал Мэрлин в комментариях, эпоха Unix имеет ограниченный диапазон. Если вы гарантированно имеете нули перед 1-значными месяцами и датами, вы также можете использовать strcmp:

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