Intereting Posts
Получить исходный URL-адрес реферера из Google Search с помощью PHP? Выяснение точного ключа, созданного mcrypt PHP PHP exec () не будет выполнять команду оболочки при ее выполнении через браузер PHP: извлечение полей fdf в виде массива из PDF-файла Ошибки для входа в систему пользователя Codeignigniter Symfony, как использовать событие формы для проверки динамической клиентской формы Установите расширение интернационализации PHP (Intl) на XAMPP на Mac Разделить предложение на слова Получение отметки времени на сегодня в полночь? Избранная опция symfony2 Как получить изображения из папки по одному и отобразить на странице с помощью PHP Извлечение набора результатов JSONP в PHP WordPress wp_remote_post () дает «ошибка cURL 6: не удалось разрешить хост» ckeditor-ckfinder атрибуты по умолчанию (ширина и высота) для загруженных изображений Как использовать подготовленный оператор pdo для порядка и ограничений?

Сравнение двух строк даты ISO8601 в 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) корректным – то есть я могу избавиться от своей функции (чтобы сохранить несколько тактовых циклов на сервере), или это более безопасно для объяснения сравнения в пользовательской функции?

Solutions Collecting From Web of "Сравнение двух строк даты ISO8601 в PHP"

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 }