php посчитать количество дней между датами
Поиск количества дней между двумя датами
Как найти количество дней между двумя датами с помощью PHP?
Преобразуйте даты в временные метки unix, затем выровняйте один из другого. Это даст вам разницу в секундах, которую вы разделите на 86400 (количество секунд в день), чтобы дать вам приблизительное количество дней в этом диапазоне.
Используя ceil округляет количество дней до следующего полного дня. Вместо этого используйте floor если вы хотите получить количество полных дней между этими двумя датами.
Результат, как показано ниже:
Правильный ответ – тот, который дал Сакшам Гупта (другие ответы также верны):
Или процедурно как однострочный:
Если вы действительно должны использовать отметки времени UNIX, установите часовой пояс на GMT, чтобы избежать большинства ловушек, описанных ниже.
Длительный ответ
Большинство ответов с использованием временных меток UNIX делают два предположения, которые, вместе взятые, могут привести к сценариям с неправильными результатами и небольшими ошибками, которые могут быть трудно отследить, и возникают даже дни, недели или месяцы после успешного развертывания.
Обычно при преобразовании «дня» в временную метку UNIX получается временная метка в полночь того дня.
Вторая ошибка – один день – 86400 секунд. Это почти всегда верно – это бывает достаточно часто, чтобы не заметить время, когда этого не происходит. Но расстояние в секундах между двумя последовательными полуночами – это не 86400, по крайней мере, два раза в год, когда вступает в действие летнее время. Сравнение двух дат на границе DST снова даст неправильный ответ.
или пол (время () – strtotime ($ somedate)) / 86400
вернется, скажем, 17, когда DATE1 и DATE2 находятся в одном сегменте DST года; но он может вернуться 17.042, а еще хуже – 16.958. Использование floor () или любого неявного усечения в integer затем преобразует то, что должно было быть от 17 до 16.
Поэтому, если вы действительно хотите использовать временные метки UNIX:
в качестве альтернативы, не рассчитывайте разницы между D1-M1-YYY1 и D2-M2-YYY2. Эти даты будут действительно рассматриваться как D1-M1-YYY1 00:00:00 и D2-M2-YYY2 00:00:00. Скорее, конвертируйте между D1-M1-YYY1 22:30:00 и D2-M2-YYY2 04:30:00. Вы всегда получите остаток около двадцати часов. Это может стать двадцать один час или девятнадцать, а может быть, восемнадцать часов, пятьдесят девять минут тридцать шесть секунд. Не важно. Это большой запас, который останется там и останется положительным в обозримом будущем. Теперь вы можете усекать его с помощью floor() в безопасности.
Правильное решение состоит в том, чтобы
использовать библиотеку времени (Datetime, Carbon, что угодно); не сворачивайте свои собственные
регулярно проводите эти тесты вместе с остальной частью набора тестов. Это вопрос миллисекунды и может спасти вас буквально часами царапин на голове.
Независимо от вашего решения, проверьте его
Функция funcdiff ниже реализует одно из решений (как это принято, принятое) в реальном мире.
История ужасов: стоимость «экономии времени»
Это произошло несколько месяцев назад. Гениальный программист решил сэкономить несколько микросекунд при расчете, которое заняло не более тридцати секунд, подключив печально известный код «(MidnightOfDateB-MidnightOfDateA) / 86400» в нескольких местах. Это была настолько очевидная оптимизация, что он даже не документировал ее, и оптимизация прошла интеграционные тесты и скрывалась в коде несколько месяцев, и все это незамечено.
Это произошло в программе, которая рассчитывает заработную плату для нескольких продавцов, продавших самые продаваемые продавцы, причем наименьшее из которых имеет страшное много больше, чем целая скромная команда из пяти человек, составленная вместе. Однажды несколько месяцев назад, по причинам, которые мало что значили, ошибка ударила – и некоторые из этих парней получили один день целых полных комиссий. Они определенно не позабавились.
Бесконечно худшие, они потеряли (уже очень мало) вера, которую они имели в программе, не предназначенную для тайного приведения их в порядок, и притворились – и получили – полный подробный обзор кода с тестовыми примерами был запущен и прокомментирован в терминах непрофессионала (плюс много лечения красной ковровой дорожкой в следующие недели).
Что я могу сказать: с положительной стороны, мы избавились от большого технического долга и смогли переписать и реорганизовать несколько частей беспорядка спагетти, который вернулся к заражению COBOL в качающихся 90-х годах. Программа, несомненно, работает лучше сейчас, и есть намного больше информации для отладки, чтобы быстро получить нуль, когда что-то выглядит подозрительно. Полагаю, что только это последнее спасет, возможно, один или два человеко-дня в месяц в обозримом будущем.
На минусовой стороне вся броухаха стоила компании около 200 000 евро впереди – плюс лицо, плюс, несомненно, какая-то способность торговаться (и, следовательно, еще больше денег).
Парень, ответственный за «оптимизацию», сменил работу год назад, до катастрофы, но все же был разговор, чтобы подать в суд на него за ущерб. И с верхними эшелонами не получилось, что это была «вина последнего парня» – это было похоже на настройку для нас, чтобы вылечить эту проблему, и, в конце концов, мы все еще в собачьей упряжке и одна из команд планирует выйти.
Девяносто девять раз из ста, «взлом 86400» будет работать безупречно. (Например, в PHP, strtotime() игнорирует DST и сообщает, что между полуночи последней субботы октября и дня следующего понедельника прошло ровно 2 * 24 * 60 * 60 секунд, даже если это явно не так … и две неудачи с радостью сделают одно право).
Простота использования date_diff
Ну, выбранный ответ не самый правильный, потому что он выйдет за пределы UTC. В зависимости от часового пояса ( списка ) могут быть корректировки времени, создающие дни «без» 24 часов, и это приведет к сбою расчета (60 * 60 * 24).
Поэтому правильным решением будет использование DateTime
Теперь он работает
Я использую Carbon в моих проектах композитора для этой и подобных целей.
Это было бы так просто:
и, при необходимости:
Если у вас есть время в секундах (отметка времени Unix Unix), вы можете просто вычесть время и разделить на 86400 (секунды в день)
Если вы хотите повторить все дни между датой начала и окончания, я придумал следующее:
Если вы используете MySql
Вот моя улучшенная версия, которая показывает 1 год (ы) 2 Месяцев (ы) 25 дней (ы), если 2-й параметр передан.
Попробуйте использовать углерод
Также вы можете использовать
для создания объекта Carbon date с использованием заданной строки timestamp.
использовал вышеуказанный код очень просто. Благодарю.
Работа с датами в PHP
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Для работы с датами в PHP применяются различные функции. Мы начнем изучение с функции time.
Функция time, формат timestamp
Функция time возвращает разницу в секундах между 1-го января 1970 года и текущим моментом времени. Такое представление даты называется форматом timestamp.
Зачем нужен timestamp?
Время в формате timestamp используется для того, чтобы найти разницу между датами в секундах.
С помощью функции time мы можем получить только текущий момент времени. Чтобы получить timestamp за любую дату следует использовать функцию mktime:
Функция mktime
Функция mktime работает аналогично функции time, но, в отличие от нее, принимает параметры: mktime(час, минута, секунда, месяц, день, год) (обратите внимание на то, что месяц и день переставлены местами ). Посмотрите примеры работы:
Полученная разница в секундах будет выглядеть так: 686663132 (обновите страницу и это число поменяется).
Вооружившись знаниями о том, что такое формат timestamp (он нам еще понадобится в дальнейшем), изучим более полезные функции для работы с датами, например, функцию date.
Функция date
Функция date выводит текущие дату и время в заданном формате.
Формат задается управляющими командами (английскими буквами), при этом можно вставлять любые разделители между ними (дефисы, двоеточие и так далее).
Примеры работы с date:
Второй параметр функции date
Функция date имеет второй необязательный параметр, который принимает момент времени в формате timestamp. Если передать этот параметр, то функция date отформатирует не текущий момент времени, а тот, который передан вторым параметром. Этот timestamp можно получить, к примеру, через mktime (но не обязательно):
Функция strtotime
Следующая полезная функция, которую мы разберем, называется strtotime.
К примеру, я могу передать ей строку ‘2025-12-31’ и функция сама разберет, где тут год, где месяц, а где день, и вернет эту дату в формате timestamp.
Все форматы можно посмотреть тут.
Следующий код вернет дату предыдущего понедельника:
Как добавить или отнять дату
Пример 1
Давайте создадим объект с датой за 2025 год, 12 месяц, 31 день, затем прибавим к ней 1 день и выведем в формате ‘день.месяц.год’
Результат выполнения кода:
Пример 2
Давайте создадим объект с датой за 2025 год, 12 месяц, 31 день, затем прибавим к ней 3 дня и выведем в формате ‘день.месяц.год’
Результат выполнения кода:
Пример 3
Давайте создадим объект с датой за 2025 год, 12 месяц, 31 день, затем прибавим к ней 3 дня и 1 месяц и выведем в формате ‘день.месяц.год’
Результат выполнения кода:
Пример 4
Давайте создадим объект с датой за 2025 год, 1 месяц, 1 день, затем отнимем от нее 1 день и выведем в формате ‘день.месяц.год’
Результат выполнения кода:
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Вычислить количество месяцев между двумя датами в PHP?
без использования PHP 5.3 date_diff функция (я использую PHP 5.2.17), есть ли простой и точный способ сделать это? Я думаю о чем-то вроде кода ниже, но я не знаю, как учитывать високосные годы:
Я пытаюсь определить, сколько месяцев человеку.
8 ответов
вы можете включить дни где-то тоже, в зависимости от того, имеете ли вы в виду весь месяцев или нет. Надеюсь, вы поняли.
Это простой метод, который я написал в своем классе, чтобы подсчитать количество месяцев, участвующих в двух заданных датах:
Если вы хотите включить дни, то используйте это:
недавно мне нужно было рассчитать возраст в месяцах от пренатального до 5 лет (60 + месяцев).
ни один из ответов не работал для меня. Первый, который я пробовал, который в основном является 1 лайнером для ответа deceze
это не удается с установленными датами, очевидно, ответ должен быть 0, поскольку метка месяца (2011-12-04) еще не достигнута, как бы код ни возвращал 1.
второй метод, который я пробовал, используя Adam’s код
Это не удается, и говорит 0 месяцев, когда он должен быть 1.
что сработало для меня-это расширение настоящего Кодекса. Я использовал следующее:
следите за ответом @deceze (я проголосовал за его ответ). Месяц все равно будет считаться целым, даже если день первого свидания не дошло до дня второго свидания.
вот мое простое решение по включению дня: