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

Функция time, формат timestamp

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

Зачем нужен timestamp?

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

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

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

Функция mktime

Функция mktime работает аналогично функции time, но, в отличие от нее, принимает параметры: mktime(час, минута, секунда, месяц, день, год) (обратите внимание на то, что месяц и день переставлены местами). Посмотрите примеры работы:

<?php
	/*
		Функция вернет timestamp для 31 января 2017 года,
		12 часов, 43 минуты, 59 секунд:
	*/
	echo mktime(12, 43, 59, 1, 31, 2017);
?>

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

<?php
	/*
		Функция вернет timestamp для 31 января текущего года,
		12 часов, 43 минуты, 59 секунд:
	*/
	echo mktime(12, 43, 59, 1, 31);
?>
<?php
	/*
		Функция вернет timestamp для 23 (это номер текущего дня)
		января текущего года, 12 часов, 43 минуты, 59 секунд:
	*/
	echo mktime(12, 43, 59, 1);
?>
<?php
	/*
		Функция вернет timestamp текущего дня, текущего месяца, текущего года,
 		12 часов, 43 минуты, 59 секунд:
	*/
	echo mktime(12, 43, 59);
?>

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

<?php
	/*
		Функция time() вернет текущий момент времени в формате timestamp,
		а mktime - за заданную дату.

		Отнимем результаты друг от друга и получим разницу в секундах:
	*/
	echo time() - mktime(12, 0, 0, 2, 1, 2000);
?>

Полученная разница в секундах будет выглядеть так: 562035941 (обновите страницу и это число поменяется).

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

Функция 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 – количество дней в указанном месяце.

Примеры работы с date:

<?php
	//Все примеры показаны для даты 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

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

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

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

<?php
	//Узнаем какой день недели был 29-12-2013:
	echo date('w', mktime(0, 0, 0, 12, 29, 13)); //вернет '0' - воскресенье
?>

Функция strtotime

Следующая полезная функция, которую мы разберем, называется strtotime.

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

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

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

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

Примеры работы:

<?php
	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"); 
?>

Следующий код вернет дату предыдущего понедельника:

<?php
	echo date('d-m-Y', strtotime("last Monday"));
?>

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

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

Пример 1

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

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

Результат выполнения кода:

01.01.2026

Пример 2

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

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

Результат выполнения кода:

03.01.2026

Пример 3

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

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

Результат выполнения кода:

03.02.2026

Пример 4

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

<?php
	$date = date_create('2025-01-01');
	date_modify($date, '-1 day');
	echo date_format($date, 'd.m.Y');
?>

Результат выполнения кода:

31.12.2024