Полный цикл в digital

Работа с датами

Для работы с датами в PHP применяются различные встроеные функции.

Функция time и mktime

Функция time возвращает разницу в секундах между 1-го января 1970 года и текущим моментом времени. Такое представление даты называется форматом timestamp. Время в формате timestamp используется для того, чтобы найти разницу между датами в секундах.

Например есть timestamp за 1-ое января текущего года и timestamp за текущий момент времени. Отнимаем один от другого и получаем разницу между этими моментами в секундах, делим эту разницу на 60 и получаем разницу в минутах (в минуте 60 секунд), делим еще на 60 и получу разницу в часах (в часе 60 минут), и так далее.

С помощью функции time можно получить только текущий момент времени. Чтобы получить timestamp за любую дату следует использовать функцию mktime

Функция mktime работает аналогично функции time, только принимает параметры:

<?
mktime(час, минута, секунда, месяц, день, год);

Функция вернет timestamp для 31 января 2022 года, 12 часов, 43 минуты, 59 секунд:

<?
echo mktime(12, 43, 59, 1, 31, 2022);

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

Решим типичную задачу на time и mktime. Пусть нам нужно найти разницу в секундах между текущим моментом времени и полуднем (12 часов, 0 минут, 0 секунд) 1-го февраля (февраль - это месяц номер 2) 2000 года. Функция time вернет текущий момент времени в формате timestamp, а mktime - за заданную дату. Отнимем результаты друг от друга и получим разницу в секундах:

<?
echo time() - mktime(12, 0, 0, 2, 1, 2000);

Функция strtotime

Функция strtotime тоже возвращает timestamp, только принимает дату в более свободном формате.

Если передать строку 2025-12-31 функция сама разберет, где тут год, где месяц, а где день и вернет эту дату в формате timestamp.

Можно написать так - strtotime('now') и мы получим текущий момент времени, или так strtotime('next Monday') и мы получим следующий понедельник (Monday по-английски 'понедельник').

Все форматы можно посмотреть тут.

<?
echo strtotime("now");
echo strtotime("10 September 2000");
echo strtotime("+1 day")
echo strtotime("+1 week");
echo strtotime("+1 week 2 days 4 hours 2 seconds");
echo strtotime("next Thursday");
echo strtotime("last Monday");

Функция date

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

  • U количество секунд, прошедших с 1 января 1970 года (то есть timestamp)
  • z номер дня от начала года
  • Y год, 4 цифры
  • y год, две цифры
  • m номер месяца (с нулем спереди)
  • n номер месяца без нуля впереди
  • d номер дня в месяце, всегда две цифры (то есть первая может быть нулем)
  • j номер дня в месяце без предваряющего нуля
  • w день недели (0 - воскресенье, 1 - понедельник и т.д.)
  • h часы в 12-часовом формате
  • H часы в 24-часовом формате
  • i минуты
  • s секунды
  • L 1, если високосный год, 0, если не високосный
  • W порядковый номер недели года
  • t количество дней в указанном месяце
<?
//Все примеры показаны для даты 01.06.2013 в 12.23.59, понедельник
echo date('Y');  // вернет '2013'
echo date('y');  // вернет '13'
echo date('m');  // вернет '06' - номер месяца
echo date('d');  // вернет '01' - номер дня в месяце
echo date('j');  // вернет '1' - номер дня в месяце (без нуля спереди)
echo date('w');  // вернет '1' - понедельник
echo date('H');  // вернет '12' - часы
echo date('i');  // вернет '23' - минуты
echo date('s');  // вернет '59' - секунды
echo date('d-m-Y');  // вернет '01-06-2013'
echo date('d.m.Y');  // вернет '01.06.2013'
echo date('H:i:s d.m.Y');  // вернет '12:23:59 01.06.2013'

Второй параметр

Функция date имеет второй необязательный параметр, который принимает момент времени в формате timestamp. Если передать этот параметр, то функция date отформатирует не текущий момент времени, а который передан вторым параметром. Этот timestamp можно получить к примеру, через mktime (но не обязательно):

<?
echo date('d-m-Y', mktime(0, 0, 0, 12, 29, 13)); //вернет '29-12-2013'

Этим можно воспользоваться, чтобы узнать номер дня недели за определенную дату - просто передадим ее вторым параметром с помощью функции mktime, а первым параметром поставим управляющий символ w. Узнаем какой день недели был 29-12-2013:

<?
echo date('w', mktime(0, 0, 0, 12, 29, 13));  // вернет '0' - воскресенье

Объекты DateTime и DateTimeZone

Объект PHP DateTime является объектно-ориентированным подходом к работе с датами и часовыми поясами. Конструктор принимает строковое представление времени, значение по умолчанию, если аргумент не указан now (сейчас).

<?
$date = new DateTime("now");

Метод format объекта DateTime работает так же, как функция date, принимает все те же символы форматирования. Объект DateTime также имеет несколько полезных констант, которые могут быть переданы в метод format:

<?
print $dt->format(DATE_ATOM);  // 2011-12-20T15:57:45-05:00
print $dt->format(DATE_ISO8601);  // 2011-12-20T15:57:45-0500
print $dt->format(DATE_RFC822);  // Tue, 20 Dec 11 15:57:45 -0500
print $dt->format(DATE_RSS);  // Tue, 20 Dec 2011 15:57:45 -0500

Полный список констант можно найти на странице документации DateTime.

Поскольку мы будем работать с часовыми поясами, давайте установим часовой пояс по умолчанию. В файле конфигурации php.ini найдите раздел который выглядит следующим образом:

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
; date.timezone = 

Если значение не указано для date.timezone, PHP будет пытаться сделать все возможное, чтобы определить часовой пояс системы которая установлена на вашем сервере. Вы можете проверить, какое значения использует PHP при помощи функции date_default_timezone_get():

<?
print date_default_timezone_get();  // America/New_York

Давайте установим временную зону сервера на время UTC date.timezone = UTC и сохраним файл конфигурации. Вы должны перезагрузить Apache или CLI, чтобы увидеть изменения. Объект DateTime включает в себя внутренний экземпляр класса DateTimeZone для отслеживания часовых поясов. Когда вы создаете новый экземпляр DateTime, DateTimeZone должен быть установлен по умолчанию как указано в php.ini.

<?
$dt = new DateTime();
print $dt->getTimeZone()->getName();  // UTC

Полный список допустимых имен часовых поясов можете найти на соответствующей странице документации.

Как добавить или отнять дату

Чтобы отнять или прибавить к дате определенный промежуток времени, следует пользоваться комбинацией из трех функций:

  1. date_create подготавливает дату к работе (дата должна быть в формате год-месяц-день) создавая так называемый объект дата, с которым производятся дальнейшие манипуляции
  2. date_modify прибавляет или отнимает
  3. date_format выводит получившуюся дату в заданном формате

Давайте создадим объект с датой за 2025 год, 12 месяц, 31 день, затем прибавим к ней 1 день и выведем в формате 'день.месяц.год':

<?
$date = date_create('2025-12-31');
date_modify($date, '1 day');
echo date_format($date, 'd.m.Y');  // 01.01.2026

Создадим объект с датой за 2025 год, 12 месяц, 31 день, затем прибавим к ней 3 дня и выведем в формате 'день.месяц.год':

<?
$date = date_create('2025-12-31');
date_modify($date, '3 days');
echo date_format($date, 'd.m.Y');  // 03.01.2026

Создадим объект с датой за 2025 год, 12 месяц, 31 день, затем прибавим к ней 3 дня и 1 месяц и выведем в формате 'день.месяц.год':

<?
$date = date_create('2025-12-31');
date_modify($date, '3 days 1 month');
echo date_format($date, 'd.m.Y');  // 03.02.2026

Создадим объект с датой за 2025 год, 1 месяц, 1 день, затем отнимем от нее 1 день и выведем в формате 'день.месяц.год':

<?
$date = date_create('2025-01-01');
date_modify($date, '-1 day');
echo date_format($date, 'd.m.Y');  // 31.12.2024
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг