php сколько дней между датами
Работа с датами в PHP
Учебник PHP
Практика
Важное
Регулярки
Работа с htaccess
Файлы, папки
Сессии и куки
Работа с БД
Практика по работе с БД в PHP
Перед чтением см. новые уроки раздела «Важное», которые появились выше.
Практика
Движок PHP
Продвинутые БД
Аутентификация
Практика
ООП и MVC
Абстрактные классы и интерфейсы
Трейты
ООП Магия
Практика
Практика: классы как набор методов
Для работы с датами в PHP применяются различные функции. Мы начнем изучение с функции time.
Функция time, формат timestamp
Функция time возвращает разницу в секундах между 1-го января 1970 года и текущим моментом времени. Такое представление даты называется форматом timestamp.
Зачем нужен timestamp?
Время в формате timestamp используется для того, чтобы найти разницу между датами в секундах.
С помощью функции time мы можем получить только текущий момент времени. Чтобы получить timestamp за любую дату следует использовать функцию mktime:
Функция mktime
Функция mktime работает аналогично функции time, но, в отличие от нее, принимает параметры: mktime(час, минута, секунда, месяц, день, год) (обратите внимание на то, что месяц и день переставлены местами ). Посмотрите примеры работы:
Полученная разница в секундах будет выглядеть так: 686663480 (обновите страницу и это число поменяется).
Вооружившись знаниями о том, что такое формат 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 день и выведем в формате ‘день.месяц.год’
Результат выполнения кода:
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
DateTime::diff
DateTimeInterface::diff
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Описание
Список параметров
Дата и время для сравнения.
Используется, чтобы вернуть абсолютную разницу.
Возвращаемые значения
DateInterval объект представляет разницу между двумя датами или false в случае возникновения ошибки.
Примеры
Пример #1 Пример использования DateTime::diff()
Результат выполнения данных примеров:
Пример #2 Сравнение объектов DateTime
Объекты DateTime могут сравниваться при помощи операторов сравнения.
= new DateTime ( «now» );
$date2 = new DateTime ( «tomorrow» );
Результат выполнения данного примера:
Смотрите также
User Contributed Notes 30 notes
It is worth noting, IMO, and it is implied in the docs but not explicitly stated, that the object on which diff is called is subtracted from the object that is passed to diff.
$date1 = new DateTime(‘now’);
$date2 = new DateTime(‘tomorrow’);
In some situations, this won’t say «in 1 days», but «in 0 days».
I think this is because «now» is the current time, while «tomorrow» is the current day +1 but at a default time, lets say:
Now: 08:00pm, 01.01.2015
Tomorrow: 00:00am, 02.01.2015
In this case, the difference is not 24 hour, so it will says 0 days.
Better use «today», which should also use a default value like:
Today: 00:00am, 01.01.2015
Tomorrow: 00:00am, 02.01.2015
which now is 24 hour and represents 1 day.
This may sound logical and many will say «of course, this is right», but if you use it in a naiv way (like I did without thinking), you can come to this moment and facepalm yourself.
Conclusion: «Now» is «Today», but in a different clock time, but still the same day!
After wrestling with DateTime::diff for a while it finally dawned on me the problem was both in the formatting of the input string and the formatting of the output.
The task was to calculate the duration between two date/times.
1. Make sure you have a valid date variable. Both of these strings are valid:
$strStart = ‘2013-06-19 18:25’ ;
$strEnd = ’06/19/13 21:47′ ;
?>
2. Next convert the string to a date variable
3. Calculate the difference
4. Format the output
[Modified by moderator for clarify]
Using the identical (===) comparision operator in different but equal objects will return false
If you want to quickly scan through the resulting intervals, you can use the undocumented properties of DateInterval.
The function below returns a single number of years, months, days, hours, minutes or seconds between the current date and the provided date. If the date occurs in the past (is negative/inverted), it suffixes it with ‘ago’.
It seems that while DateTime in general does preserve microseconds, DateTime::diff doesn’t appear to account for it when comparing.
= ‘2014-03-18 10:34:09.939’ ;
$val2 = ‘2014-03-18 10:34:09.940’ ;
To work around this apparent limitation/oversight, you have to additionally compare using DateTime::format.
I needed to get the exact number of days between 2 dates and was relying on the this diff function, but found that I was getting a peculiar result with:
I had to end up using :
Though I found a number of people who ran into the issue of 5.2 and lower not supporting this function, I was unable to find any solid examples to get around it. Therefore I hope this can help some others:
Определение количества дней между двумя датами
Как найти количество дней между двумя датами с помощью PHP?
30 ответов
Если вам нужно относительное (подписанное) количество дней, используйте вместо этого:
Начиная с версии PHP 5.3 и выше, для большей разницы были добавлены новые функции даты / времени:
Результат, как показано ниже:
Преобразуйте даты в метки времени unix, а затем вычтите одну из другой. Это даст вам разницу в секундах, которую вы разделите на 86400 (количество секунд в день), чтобы получить приблизительное количество дней в этом диапазоне.
Легко использовать date_diff
Что ж, выбранный ответ не самый правильный, потому что он не сработает за пределами UTC. В зависимости от часового пояса (list) могут быть корректировки времени, создающие дни «без» 24 часа, и это приведет к сбою расчета (60 * 60 * 24).
Итак, правильное решение будет использовать DateTime
Теперь это работает
Рассчитайте разницу между двумя датами:
Функция date_diff () возвращает разницу между двумя объектами DateTime.
Я использую Carbon в своих композиторских проектах для этой и подобных целей.
Это было бы так просто:
Вы можете найти даты просто по
И, при необходимости:
Если у вас есть время в секундах (например, временная метка unix), вы можете просто вычесть время и разделить на 86400 (секунд в день)
количество дней между двумя датами в PHP
Вы можете попробовать приведенный ниже код:
Самый простой способ найти разницу в днях между двумя датами
Если вы хотите отображать все дни между начальной и конечной датами, я придумал следующее:
Вот моя улучшенная версия, которая показывает 1 год 2 месяца 25 дней, если передан 2-й параметр.
Использовал приведенный выше код очень просто. Спасибо.
Используя эту простую функцию. Объявить функцию
И вызовите эту функцию так, где хотите
Если вы используете MySql
Попробуйте использовать Carbon
Также вы можете использовать
Для создания объекта даты Carbon, используя заданную строку временной метки.
Просматривая все ответы, я составляю универсальную функцию, которая работает на всех версиях PHP.
В общем, я использую DateTime, чтобы найти дни между двумя датами. Но если по какой-то причине в некоторых настройках сервера не включен DateTime, он будет использовать простой (но небезопасный) расчет с помощью strtotime ().
Или процедурно как однострочный:
С оговоркой: кажется, что «% a» указывает абсолютное количество дней. Если вы хотите, чтобы оно было целым числом со знаком, т. Е. Отрицательным, когда вторая дата предшествует первой, тогда вам нужно использовать префикс «% r» (т.е. format(‘%r%a’) ).
Длинный ответ: почему деление на 24 * 60 * 60 (он же 86400) небезопасно
Обычно при преобразовании «дня» в метку времени UNIX получается метка времени для полуночи этого конкретного дня.
Таким образом, даже если вы используете «хитрость», заставляя все метки даты указывать фиксированный час, скажем, полночь (это также делается неявно в различных языках и фреймворках, когда вы указываете только день-месяц-год, а не также час-минута-секунда; то же самое происходит с типом DATE в таких базах данных, как MySQL), широко используемая формула
Вернет, скажем, 17, когда ДАТА1 и ДАТА2 находятся в одном и том же сегменте летнего времени; но даже если часть «час: минута: вторая» идентична, аргумент может быть 17.042 и, что еще хуже, 16.958, когда они находятся в разных сегментах летнего времени и часовой пояс учитывает летнее время. Использование floor () или любого неявного усечения до целого числа затем преобразует то, что должно было быть 17, в 16. В других случаях выражения типа «$ days> 17» вернут true для 17.042, даже если это будет выглядеть так, как будто количество прошедших дней равно 18.
Итак, если вы действительно хотите использовать временные метки UNIX:
использовать временную библиотеку (Datetime, Carbon, что угодно); не катай свой собственный
Каким бы ни было ваше решение, проверьте его!
Приведенная ниже функция funcdiff реализует одно из решений (как оказалось, принятое) в реальном сценарии.
История ужасов: цена «экономии времени»
Это действительно произошло несколько месяцев назад. Гениальный программист решил сэкономить несколько микросекунд на вычислениях, которые занимали самое большее около тридцати секунд, вставив в несколько мест печально известный код «(MidnightOfDateB-MidnightOfDateA) / 86400». Оптимизация была настолько очевидной, что он даже не задокументировал ее, а оптимизация прошла интеграционные тесты и пряталась в коде в течение нескольких месяцев, и все это оставалось незамеченным.
Что я могу сказать: с другой стороны, мы избавились от большого технического долга и смогли переписать и реорганизовать несколько кусков спагетти-беспорядка, возникшего в результате нашествия COBOL в бурные 90-е. Программа, несомненно, теперь работает лучше, и есть гораздо больше отладочной информации, которую можно быстро найти, когда что-то выглядит подозрительно. Я полагаю, что только это последнее сэкономит, возможно, один или два человеко-дня в месяц в обозримом будущем.
Поиск количества дней между двумя датами
Как найти количество дней между двумя датами с помощью 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?
30 ответов
вы можете использовать strtotime() для преобразования двух дат во время unix, а затем вычислить количество секунд между ними. Из этого довольно легко вычислить различные периоды времени.
Edit: очевидно, что предпочтительный способ сделать это, как описано ниже Юрка. Мой код обычно рекомендуется только если у вас нет PHP 5.3 или лучше.
несмотря на все это, я решил обращаться с жалобами. Если вам действительно нужен точный диапазон, но у вас нет доступа к PHP 5.3, используйте код ниже (он также должен работать в PHP 4). Это прямой порт кода, который PHP использует внутри для расчета диапазонов, за исключением того, что он не учитывает летнее время. Это означает, что он выключен максимум на час, но за исключением этого он должен быть правильным.
Я предлагаю использовать объекты DateTime и DateInterval.
начиная с PHP 5.2.2, объекты DateTime можно сравнивать с помощью операторов сравнения.
лучший курс действий-использование PHP DateTime (и DateInterval ) объекты. Каждая дата инкапсулируется в DateTime объект, а затем разница между ними может быть сделана:
на DateTime объект примет любой формат strtotime() будет. Если требуется еще более конкретный формат даты, DateTime::createFromFormat() можно использовать для создания DateTime объект.
после создания экземпляра обоих объектов вы вычитаете один из другого с помощью DateTime::diff() .
$difference теперь DateInterval объект с информацией разницу. А var_dump() выглядит так:
в формате DateInterval объект, нам нужно проверить каждое значение и исключить его, если это 0:
просмотр часов и минут и секунд..
взгляните на следующую ссылку. Это лучший ответ, который я нашел до сих пор.. 🙂
не имеет значения, какая дата раньше или позже, когда вы проходите в параметры даты. Функция использует абсолютное значение PHP ABS() для всегда возвращайте положительное число как количество дней между двумя даты.
имейте в виду, что количество дней между двумя датами не включительно. Так что, если вы ищете количество дней представлено всеми датами между и включая введенные даты, вам нужно будет добавить один (1) к результату этой функции.
Я голосовал за Юрка ‘ s ответ как это мой любимый, но у меня есть pre-php.5.3 версии.
я получил оригинальную идею от здесь, который я изменил для моего использования (и я надеюсь, что моя модификация будет отображаться на этой странице).
Я не знаю, используете ли вы фреймворк PHP или нет, но многие фреймворки PHP имеют библиотеки даты/времени и помощники, которые помогут вам не изобретать колесо.