Найти количество дней между двумя датами

Как найти количество дней между двумя датами с помощью PHP?

5 ответов


$now = time(); // or your date as well
$your_date = strtotime("2010-01-01");
$datediff = $now - $your_date;

echo round($datediff / (60 * 60 * 24));

Если вы используете PHP 5.3 >, это, безусловно, самый точный способ расчета разницы:

$earlier = new DateTime("2010-07-06");
$later = new DateTime("2010-07-09");

$diff = $later->diff($earlier)->format("%a");

из PHP версии 5.3 и выше,новые функции даты / времени были добавлены, чтобы получить разницу:

$datetime1 = new DateTime("2010-06-20");

$datetime2 = new DateTime("2011-06-22");

$difference = $datetime1->diff($datetime2);

echo 'Difference: '.$difference->y.' years, ' 
                   .$difference->m.' months, ' 
                   .$difference->d.' days';

print_r($difference);

результат, как показано ниже:

Difference: 1 years, 0 months, 2 days

DateInterval Object
(
    [y] => 1
    [m] => 0
    [d] => 2
    [h] => 0
    [i] => 0
    [s] => 0
    [invert] => 0
    [days] => 367
)

надеюсь, что это помогает !


преобразуйте даты в метки времени unix, затем вычитайте одну из другой. Это даст вам разницу в секундах, которую вы делите на 86400 (количество секунд в день), чтобы дать вам приблизительное количество дней в этом диапазоне.

если ваши даты в формате 25.1.2010, 01/25/2010 или 2010-01-25 можно использовать strtotime функция:

$start = strtotime('2010-01-25');
$end = strtotime('2010-02-20');

$days_between = ceil(abs($end - $start) / 86400);

используя ceil округляет количество дней до следующего полного дня. Использовать floor вместо этого, если вы хотите получить количество полных дней между двумя датами.

если ваши даты уже находятся в формате метки времени unix, вы можете пропустить преобразование и просто сделать $days_between часть. Для более экзотических форматов даты вам, возможно, придется выполнить пользовательский синтаксический анализ, чтобы получить его правильно.


TL; DR do не используйте метки времени UNIX. не используйте time(). Если вы будьте готовы если его 98.0825% надежности не удастся вам. Используйте DateTime (или Carbon).

на правильный ответ это тот, который дал Сакшам Гупта (другие ответы также верны):

$date1 = new DateTime('2010-07-06');
$date2 = new DateTime('2010-07-09');
$days  = $date2->diff($date1)->format('%a');

или процедурно как один-лайнер:

/**
 * Number of days between two dates.
 *
 * @param date $dt1    First date
 * @param date $dt2    Second date
 * @return int
 */
function daysBetween($dt1, $dt2) {
    return date_diff(
        date_create($dt2),  
        date_create($dt1)
    )->format('%a');
}

если вы действительно должны использовать временные метки UNIX,установить часовой пояс для GMT избежать большинство из недостатков описанных ниже.


длинный ответ: почему разделение на 24*60*60 (ака 86400) небезопасно

большинство ответов, использующих временные метки UNIX (и 86400, чтобы преобразовать это в дни), делают два предположения, которые, вместе взятые, могут привести к сценариям с неправильные результаты и тонкие ошибки это может быть трудно отслеживать, и возникают даже дни, недели или месяцы после успешного развертывание. Дело не в том, что решение не работает - оно работает. Сегодня. Но завтра он может перестать работать.

первая ошибка не учитывает этого, когда его спрашивают: "сколько дней прошло со вчерашнего дня?"компьютер может правдиво ответить ноль если между настоящим и моментом, указанным "вчера", меньше целый день прошло.

обычно при преобразовании " дня " в метку времени UNIX получается метка времени для полночь этого конкретного дня.

пятнадцать дней минус 5 минут истекли, и большинство решений с использованием floor() или выполнение неявного преобразования целых чисел сообщу на один день меньше, чем ожидалось.

Итак, "сколько дней назад был Y-m-d H:i:s"? даст неправильно ответ.

вторая ошибка приравнивает один день к 86400 секунд. Это почти всегда правда-это происходит достаточно часто, чтобы упустить время, когда это не так. Но расстояние в секундах между двумя последовательными полуночниками конечно не 86400, по крайней мере, два раза в год, когда летнее время вступает в игру. Сравнение двух дат через границу DST даст неправильный ответ.

поэтому, даже если вы используете "Хак", заставляя все даты метки времени до фиксированного часа, скажем, полночь (это также делается неявно различными языками и фреймворками, когда вы указываете только день-месяц-год, а не час-минуту-секунду; то же самое происходит с типом даты в базах данных, таких как MySQL), широко используемая формула

 (unix_timestamp(DATE2) - unix_timestamp(DATE1)) / 86400

или

 floor(time() - strtotime($somedate)) / 86400

вернется, скажем, 17, когда DATE1 и DATE2 находятся в одном и том же сегменте DST года; но он может вернуться 17.042, и что еще хуже, 16.958. Использование пол() или любой неявное усечение в integer затем преобразует то, что должно было быть 17 в 16. При других обстоятельствах такие выражения, как" $days > 17", вернутся true для 17.042, даже если это означает, что количество прошедших дней равно 18.

и все становится еще уродливее с такого кода не портативный через платформы, потому что