Сравнение дат в PHP с помощью функции StrToTime ()

В PHP можно легко создать удобочитаемую дату или время, используя функцию Date(). Эта функция принимает два аргумента: допустимый формат даты и метку времени Unix (если ее не указывать, функция возвратит текущую дату/время).

Пример

$right_now = date("Y-m-d H:i:s");
//Это вернет текущие 
//дату и время в указанном формате
echo "<p>" . $right_now . "</p>";

Приведенный выше пример прекрасно подходит для отображения дат и времени. Но когда дело доходит до PHP сравнения дат, использовать удобные для чтения строки - не самый надежный способ. Намного эффективнее сравнить временные метки. Метка времени Unix содержит количество секунд между 1 января 1970 00:00:00 GMT и указанным временем. Это означает, что можно сравнивать даты вплоть до секунд.

Чтобы использовать функцию date() для возврата конкретной даты необходима метка времени, так что сначала потребуется создать ее. Это можно сделать с помощью функций mktime() или strotime(). Обе функции возвращают метку времени Unix, но при этом принимают различные аргументы.

Функция mktime() требует, чтобы дата и время были переданы ей в виде отдельных сегментов (часы, минуты, секунды, месяц, день, год):

$timestamp1 = mktime(16, 00, 15, 1, 5, 2016);
//Возвращает: 2016-01-05 16:00:15
echo "<p>" . date( 'Y-m-d H:i:s' , $timestamp1) . "</p>";

В свою очередь функция strtotime() может преобразовать текстовое представление даты/времени в метку времени:

$timestamp2 = strtotime("2016-01-05 16:00:15");
//Возвращает: 2016-01-05 16:00:15
echo "<p>" . date( 'Y-m-d H:i:s' , $timestamp2) . "</p>";

Если при PHP сравнении даты с текущей функция strtotime() получает дату/время, в которых день и месяц располагаются перед годом, эта запись будет интерпретироваться по-разному, в зависимости от используемого разделителя. При использовании косой черты в качестве разделителя функция возвратит метку времени в американском формате (м/д/г). При использовании в качестве разделителя тире или точки функция возвратит метку в европейском формате (д-м-г).

Как можно увидеть ниже, первая метка времени отличается от двух последних:

$american_format = strtotime('05/01/2016');
//Дает нам: 1462053600
echo "<p>" . $american_format . "</p>";

$european_format1 = strtotime('05-01-2016');
//Дает нам: 1451948400
echo "<p>" . $european_format1 . "</p>";

$european_format2 = strtotime('05.01.2016');
//Дает нам: 1451948400
echo "<p>" . $european_format2 . "</p>";

Функции mktime() и strtotime() возвращают одинаковый результат. Часто текстовое представление даты и времени ('2016-01-01') хранится в базе данных и считывается из нее через HTML-форму. Например, при помощи библиотеки jQuery datepicker, которая идеально подходит для использования функции strtotime().

Прежде чем осуществлять сравнение двух дат в PHP, важно убедиться, что временные метки созданы с помощью одного и того же формата. Можно воспользоваться функцией mktime(). Ее преимущество заключается в том, что она намного строже в отношении передаваемой ей даты или время.

Важным преимуществом использования функции strtotime() является гибкость и простота, с которой можно добавить время или вычесть из него:

//Это вернет текущую дату плюс 1 неделю
$timestamp3 = strtotime("+1 week");
echo "<p>" . date( 'Y-m-d' , $timestamp3) . "</p>";

//Это вернет  определенную дата/время 
//плюс одну неделю('2016-01-12 16:00:15')
$timestamp4 = strtotime("+1 week", strtotime('2016-01-05 16:00:15'));
echo "<p>" . date( 'Y-m-d H:i:s' , $timestamp4) . "</p>";

//Использование mktime() для создания временной метки 
//вернет то же. Что и выше ('2016-01-12 16:00:15')
$mktime = mktime(16, 00, 15, 1, 5, 2016);
$timestamp5 = strtotime("+1 week", $mktime);
echo "<p>" . date( 'Y-m-d H:i:s' , $timestamp5) . "</p>";

Пример, показанный ниже, демонстрирует PHP сравнение даты и операции с использованием функции strtotime(). В нем создается массив дат в заданном диапазоне в соответствии с определенным временным интервалом. Функция print_r() выводит результирующий массив, который выглядит следующим образом:

Array ( [0] => 2016-01-08  
        [1] => 2016-01-15
        [2] => 2016-01-22
        [3] => 2016-01-29
        [4] => 2016-02-05
        [5] => 2016-02-12
        [6] => 2016-02-19
        [7] => 2016-02-26
        [8] => 2016-03-04
        [9] => 2016-03-11
        [10] => 2016-03-18
        [11] => 2016-03-25
      )

При сравнении двух дат в PHP внутри цикла while время (в данном случае семь дней) добавляется к дате начала и производится проверка, чтобы убедиться больше ли полученная временная метка, чем временная метка даты начала.

Если это не так, новая дата добавляется в массив $DateRange, пока цикл не закончится:

$startDate = '2016-01-01';
$endDate = '2016-03-31';
$dateRange = array();
$start = strtotime($startDate);
$end = strtotime($endDate);
$interval = 'weekly';

switch($interval) {  
    case 'weekly':      
      $str = '7 day';
    break;
    case '4_weekly':  
      $str =  '4 Weeks';
    break;
    case 'monthly':   
      $str = '1 month';
    break;
    case 'annually':
       $str =  '1 year';
    break;               
}

//заполнение массива диапазоном дат
while ($start <= $end)  
{
     $start = strtotime( "+ " . $str, $start);
     $newDate = date ( 'Y-m-d' , $start);

     if(strtotime($newDate) <= $end){
         $dateRange[] = $newDate;
     }
}

Я использовал оператор switch, чтобы определить несколько различных вариантов временного интервала. Это было сделано для того, чтобы показать, как интуитивные «временные» строки использовались для управления временной меткой с помощью функции strtotime(). В документации по PHP приводятся дополнительные примеры.

ВЛВиктория Лебедеваавтор-переводчик статьи «Compare Date and Time With PHP strtotime() | Quick Reference Tutorial»