Урок 11. Работа с датами в PHP
Теория
Для работы с датами в PHP применяются различные функции. Мы начнем изучение с функции time.
Функция time, формат timestamp
Функция time возвращает разницу в секундах между 1.1.1970 и текущим моментом времени. Такое представление даты называется форматом timestamp.
Зачем нужен timestamp?
Время в формате timestamp используется для того, чтобы найти разницу между датами в секундах.
К примеру, у меня есть timestamp за 1 января текущего года и timestamp за текущий момент времени. Отнимаем 1 от другого и получаем разницу между этими моментами в секундах. Делим эту разницу на 60 и получаем разницу в минутах (в 1 минуте 60 секунд). Делим еще на 60 и получаем разницу в часах. И т.д.
С помощью функции time можно получить только текущий момент времени. Чтобы получить timestamp за любую дату следует использовать функцию mktime:
Функция mktime
Функция mktime работает аналогично функции time, но в отличие от нее принимает параметры: mktime (час,минута,секунда,месяц,день,год) (внимание, месяц и день переставлены местами на американский манер). Примеры:
<?/*Функция вернет timestamp для 31.1.2028 12 часов 43 минуты 59 секунд:*/echo mktime(12,43,59,1,31,2028)?>
1832928239.
Параметры можно опускать с конца. Если мы не напишем год (последний параметр) - то автоматически возьмется текущий год, если не напишем еще и день (предпоследний параметр) - то возьмется текущий день и текущий год. И так далее:
<?/*Функция вернет timestamp для 31 января текущего года 12 часов 43 минуты 59 секунд:*/echo mktime(12,43,59,1,31)?>
1612089839.
<?/*Функция вернет timestamp для номер текущего дня января текущего года 12 часов 43 минуты 59 секунд:*/echo mktime(12,43,59,1)?>
1610793839.
<?/*Функция вернет timestamp текущего дня текущего месяца текущего года 12 часов 43 минуты 59 секунд:*/echo mktime(12,43,59)?>
1618566239.
Решим типичную задачу на time и mktime. Пусть нам нужно найти разницу в секундах между текущим моментом времени и полуднем (12 часов 0 минут 0 секунд) 1 февраля (февраль - это месяц номер 2) 2008:
<?/*Функция time() вернет текущий момент времени в формате timestamp, а mktime - за заданную дату. Отнимем результаты друг от друга и получим разницу в секундах:*/echo time()-mktime(12,0,0,2,1,2008)?>
Полученная разница в секундах будет выглядеть так: 416723827 (обновите страницу и это число поменяется).
Функция date
Функция date выводит текущие дату и время в заданном формате.
Формат задается управляющими командами (английскими буквами), при этом можно вставлять любые разделители между ними (дефис, двоеточие и т.д.).
Команды (заглавные буквы отличаются от обычных, обратите внимание!):
U - количество секунд, прошедших с 1.1.1970г. (т.е. timestamp).
z - номер дня от начала года.
Y - год, 4 цифры.
y - год, 2 цифры.
m - номер месяца (с 0 спереди).
n - номер месяца без 0 впереди.
d - номер дня в месяце, всегда 2 цифры (т.е. 1-я может быть 0).
j - номер дня в месяце без предваряющего 0.
w - день недели (0 - воскресенье, 1 - понедельник и т.д.).
h - часы в 12-часовом формате.
H - часы в 24-часовом формате.
i - минуты.
s - секунды.
L - 1, если високосный год, 0, если не високосный.
W - порядковый номер недели года.
t - количество дней в указанном месяце.
Примеры работы с date:
echo'<p>'.date('Y')//вернет год
2021.
echo'<p>'.date('y')//вернет 2 последних цифры года
21.
echo'<p>'.date('m')//вернет номер месяца
04.
echo'<p>'.date('d')//вернет номер дня в месяце
16.
echo'<p>'.date('j')//вернет номер дня в месяце (без 0 спереди)
16.
echo'<p>'.date('w')//вернет день недели (воскресенье - это 0)
5.
echo'<p>'.date('H')//вернет часы
17.
echo'<p>'.date('i')//вернет минуты
37.
echo'<p>'.date('s')//вернет секунды
07.
echo'<p>'.date('d-m-Y')//вернет формат '31-08-2018'
16-04-2021.
echo'<p>'.date('d.m.Y')//вернет формат '31.08.2018'
16.04.2021.
echo'<p>'.date('H:i:s d.m.Y')//вернет формат '12:28:58 31.06.2013'
17:37:07 16.04.2021.
2-й параметр функции date
Функция date имеет 2-й необязательный параметр, который принимает момент времени в формате timestamp. Если передать этот параметр, то функция date отформатирует не текущий момент времени, а тот, который передан 2-м параметром. Этот timestamp можно получить, к примеру, через mktime (но не обязательно):
<?echo date('d-m-Y',mktime(0,0,0,12,28,18))/*вернет '31-12-2018'*/?>
28-12-2018.
Этим можно воспользоваться, чтобы узнать номер дня недели за определенную дату. Просто передадим ее 2-м параметром с помощью функции mktime, а 1-м параметром поставим управляющий символ 'w':
<?/*Узнаем какой день недели был 31-12-2018:*/echo date('w',mktime(0,0,0,12,28,18))/*вернет '0' - воскресенье*/?>
5.
Функция strtotime
Функция strtotime - это аналог функции mktime (тоже возвращает timestamp), только в отличие от нее принимает дату в более свободном формате.
К примеру, я могу передать ей строку '2028-12-31' и функция сама разберет, где тут год, где месяц, а где день, и вернет эту дату в формате timestamp.
Что можно делать еще: можно написать так: strtotime('now'), и мы получим текущий момент времени, или так: strtotime('next Monday'), и мы получим следующий понедельник (Monday по-английски 'понедельник').
Все форматы можно посмотреть тут: gnu.org/software/tar/manual/html_chapter/tar_7.html#Date-input-formats
Примеры:
echo'<p>'.strtotime("now")
1618583827.
echo'<p>'.strtotime("10 September 2000")
968533200.
echo'<p>'.strtotime("+1 day")
1618670227.
echo'<p>'.strtotime("+1 week")
1619188627.
echo'<p>'.strtotime("+1 week 2 days 4 hours 2 seconds")
1619375829.
echo'<p>'.strtotime("next Thursday")
1619038800.
echo'<p>'.strtotime("last Monday")
1618174800.
Следующий код вернет дату предыдущего понедельника:
<?echo date('d-m-Y',strtotime("last Monday"))?>
12-04-2021.
Как добавить или отнять дату
Чтобы отнять или прибавить к дате определенный промежуток времени, следует пользоваться комбинацией из 3 функций: date_create подготавливает дату к работе (дата должна быть в формате год-месяц-день), создавая так называемый объект date, с которым производятся дальнейшие манипуляции, date_modify прибавляет или отнимает, date_format выводит получившуюся дату в заданном формате.
Пример 1
Создать объект с датой за 2028 12 месяц 31 день, затем прибавить к ней 1 день и вывести в формате 'день.месяц.год':
<?$d=date_create('2028-12-31');date_modify($d,'1 day');echo date_format($d,'d.m.Y')?>
01.01.2029.
Пример 2
Создать объект с датой за 2028 12 месяц 31 день, затем прибавить к ней 3 дня и выведем в формате 'день.месяц.год':
<?$d=date_create('2028-12-31');date_modify($d,'3 days');echo date_format($d,'d.m.Y')?>
03.01.2029.
Пример 3
Создать объект с датой за 2028 12 месяц 31 день, затем прибавить к ней 3 дня и 1 месяц и выведем в формате 'день.месяц.год':
<?$d=date_create('2028-12-31');date_modify($d,'3 days 1 month');echo date_format($d,'d.m.Y')?>
03.02.2029.
Пример 4
Создать объект с датой за 2028 1 месяц 1 день, затем отнять от нее 1 день и вывести в формате 'день.месяц.год':
<?$d=date_create('2028-01-01');date_modify($d,'-1 day');echo date_format($d,'d.m.Y')?>
31.12.2027.