Работа с датами
Для работы с датами в 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
Полный список допустимых имен часовых поясов можете найти на соответствующей странице документации.
Как добавить или отнять дату
Чтобы отнять или прибавить к дате определенный промежуток времени, следует пользоваться комбинацией из трех функций:
date_create
подготавливает дату к работе (дата должна быть в формате год-месяц-день) создавая так называемый объект дата, с которым производятся дальнейшие манипуляцииdate_modify
прибавляет или отнимает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