Среди разнообразных задач программирования, различные манипуляции со значениями даты и времени встречаются достаточно часто. Редкая автоматизированная система, база данных может обойтись без сохранения информации о времени того или иного процесса. Помимо простейшего добавления даты в запись базы данных или отображения этой даты, встречаются множество задач вывода этих дат в различном виде, проверки соответствия текущего времени с заданным таймером, вычисление срока между двумя датами и многое другое.
Для удобства работы с датами каждый язык программирования имеет свои специальные типы данных для хранения значения даты и времени. Чаще всего это числовое значение, либо целое, либо с плавающей точкой.
В PHP работа с датой чаще всего сталкивается с UNIX TIMESTAMP. Здесь время хранится целым числом. Исчисление времени начинается с 1 января 1970 года. Поэтому, например, дата и время 11.12.2014 19:40:00, будет представлено числом 1418316000. Эта цифра показывает, сколько секунд прошло с нулевой даты 1 января 1970 года, названой Эпохой Unix.
Получение текущего времени и даты в PHP
Для получения текущего времени сервера используется функция
int time(void)
которая как раз вернет значение в формате unix timestamp.
echo time(); // вывод текущего времени в формате unix timestamp
На первый взгляд не очень удобный формат для человека, но, как известно, чем проще представление данных, тем быстрее выполняется обработка этих значений компьютером. Кроме того, хранение числа в базе данных намного экономичнее, чем какой-либо специальный формат. Так же, PHP работает со временем одинаково и на Unix и на Windows платформе, что обеспечивает возможность использовать код на любой из этих платформ.
Преобразование формата даты и времени в PHP
Простейший механизм, позволяющий преобразовать числовое значение даты на более понятные значения, предоставляется функцией:
array getdate([int timestamp])
Она возвращает ассоциативный массив, содержащий информацию о дате. Если параметр timestamp не указан, будут возвращены сведения о текущем времени. Этот массив содержит следующие значения:
seconds | секунды (0-59) |
minutes | минуты (0-59) |
hours | часы (0-23) |
mday | день месяца (1-31) |
wday | день недели (0-6), начиная с воскресенья |
mon | месяц (1-12) |
year | год |
yday | день года (0-365) |
weekday | название дня недели (например, Monday) |
month | название месяца (например, January) |
0 | количество секунд, прошедших с начала Эпохи Unix |
Полученный массив, позволяет вывести значения нужном виде:
$date = 1418372345; // исходное дата и время 12.12.2014 11:19:05 $date_mas = getdate($date); echo $date_mas['mday'] . ' . ' . $date_mas['mon'] . ' . ' . $date_mas['year']; // 12.12.2014
Так же для преобразования формата даты и времени можно воспользоваться функцией:
string date(string $template [, int $unix_timestamp])
Она предназначена для получения текущей даты unix timestamp в нужном формате. Строковый параметр $template определяет формат вывода. Параметром $unix_timestamp можно задать, с каким значением времени производится работа. Он необязательный, поэтому, если его не указать, будет использоваться текущая дата и время.
Формат задается следующими значениями:
a | «до» и «после» полудня: «am» или «pm» |
A | «до» и «после» полудня заглавными буквами: «AM» или «PM» |
d | день месяца 2 цифрами (если меньше 10, на первом месте ноль) (от 01 до 31) |
D | день недели 3 буквами. Например, «Mon» (понедельник) |
j | день месяца, 1-2 цифры без начальных нулей (от 1 до 31) |
F | название месяца. Например, «January» |
h | час, 12-часовой формат (от 01 до 12) |
H | час, 24-часовой формат (от 00 до 23) |
g | час, 12-часовой формат без нулей (от 1 до 12) |
G | час, 24-часовой формат без нулей (от 0 до 23) |
i | минуты (от 00 до 59) |
I (заглавная i) | 1, если действует переход на летнее время, иначе 0 |
L | 1, если год високосный, или 0 если не високосный |
B | время в формате Интернет-времени (альтернативной системы отсчета времени суток) (от 000 до 999) |
T | временная зона компьютера. Например, MDT |
l (строчная L) | день недели. Например, «Monday» |
m | месяц, две цифры с нулями (от 01 до 12) |
n | месяц, одна-две цифры без нулей (от 1 до 12) |
M | сокращенное наименование месяца. Например, «Jan» |
t | число дней в указанном месяце (от 28 до 31) |
s | секунды (от 0 до 59) |
S | англоязычный порядковый суффикс числа из двух букв («st», «nd», «rd» или «th») |
U | целое число секунд, прошедших с момента начала эпохи UNIX |
y | год, цифровой, 2 цифры (14) |
Y | год, цифровой, 4 цифры (2014) |
z | порядковое число дня в году (от 0 до 365) |
Z | смешение временной зоны в секундах (от -43200 до 43200) |
N | порядковый номер дня недели от 1 (понедельник) до 7 (воскресенье) в соответствии со стандартом ISO-8601, (добавлен в версии PHP 5.1.0) |
w | порядковый номер дня недели от 0 (воскресенье) до 6 (суббота) |
W | порядковый номер недели года в соответствии со стандартом ISO-8601; недели начинаются с понедельника (добавлено в версии PHP 4.1.0) |
o | номер года в соответствии со стандартом ISO-8601. Имеет то же значение, что и Y, кроме случая, когда номер недели ISO (W) принадлежит предыдущему или следующему году; тогда будет использован год этой недели. (добавлен в версии PHP 5.1.0) |
e | код шкалы временной зоны. Например: UTC, GMT, Atlantic/Azores (добавлен в версии PHP 5.1.0) |
O | разница с временем по Гринвичу, в часах. Например: +0200 |
P | разница с временем по Гринвичу с двоеточием между часами и минутами. Например: +02:00 (добавлено в версии PHP 5.1.3) |
c | дата в формате стандарта ISO 8601. Например, 2014-12-12T15:19:21+00:00 (добавлено в PHP 5) |
r | дата в формате » RFC 2822. Например: Thu, 21 Dec 2000 16:01:07 +0200 |
U | количество секунд, прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970 00:00:00 GMT) |
Как видно из списка, с помощью этой функции можно получить очень много полезных данных о дате. Например:
$date = 1418372345; // исходное дата и время 12.12.2014 11:19:05 echo date('d.m.Y', $date); // 12.12.2014 (дата) echo date('H:i:s', $date); // 11:19:05 (время) echo date('H:i', $date); // 11:19 (время) echo date('t', $date); // 31 (число дней в месяце) echo date('z', $date); // 345 (порядковый номер дня в году) echo date('l dS \of F Y h:i:s A', $date); // Friday 12th of December 2014 11:19:05 AM
Другие символы, входящие в шаблон, будут выведены в строке как есть. Если же потребуется ввести символ, который используется в функции как код формата, перед ними вставляется символ «\». Для значения «\n» (символ перехода на новую строку), следует указать «\\n». Таким образом, можно делать вывод целого сообщения, содержащего сведения о дате и времени:
echo date('Сегодня z-й день Y-го года', $date); // Сегодня 345-й день 2014-го года
Преобразование даты и времени в формат timestamp
Для обратного преобразования даты из стандартного формата в числовое значение timestamp применяется функция:
int mktime([int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]])
Функция mktime() возвращает значение времени Unix, соответствующую дате и времени, заданным аргументами. Например:
$my_date = mktime (10, 30, 0, 12, 12, 2014);
Следует внимательно относится к порядку аргументов функции: часы, минуты, секунды, месяц, день, год.
Кроме простого формирования значения даты в timestamp, функцию mktime() можно использовать для арифметически вычисления с датами. Для этого просто можно ввести необходимые аргументы. Например, если указать 14 месяц, то в итоговом значении, месяц будет 2-й, а значение года увеличится на единицу:
$my_day = 12; $my_month = 12; $my_year = 2014; $new_date = mktime(0, 0, 0, $my_month + 5, $my_day, $my_year); echo date('d.m.Y', $new_date); // 12.05.2015 (дата)
Аналогично можно поступать и с другими параметрами.
Проверка корректности даты в PHP
При работе с датами, особенно при формировании даты предложенной выше функцией mktime() необходимо учитывать корректность вводимой даты. Для этого в PHP используется функция:
bool checkdate(int month, int day, int year)
Возвращает true если дата, заданная аргументами, является правильной; иначе возвращает false. Дата считается правильной, если:
— год в диапазоне от 1 до 32767;
— месяц в диапазоне от 1 до 12;
— день для заданного месяца с учетом високосного года указаны правильно.
Пример проверки даты:
$my_day = 32; $my_month = 12; $my_year = 2014; if (!checkdate($my_month, $my_day, $my_year)) echo 'Ошибка: дата указана некорректно';
Источник: https://space-base.ru/library/php/rabota-s-datoj-i-vremenem-v-php