Основы работы с функциями даты и времени в PHP

основы работы с функциями даты и времени в php

Разнообразие задач и проблематика

На первый взгляд данная тема может показаться довольно простой. Каждый человек ежедневно имеет дело со временем. Мы умеем измерять его, определять разницу между началом и концом временного промежутка, знаем точную дату. На бытовом уровне все довольно просто. Однако манипулирование датами и временем в программном коде имеет свои особенности.

Приложение, написанное на PHP или любом другом языке программирования, обязательно столкнется с рядом существенных проблем. Вам необходимо учесть, в каких часовых поясах проживают пользователи, и к какому формату отображения времени они привыкли. Например, жители России используют запись дат в формате «25.01.2018 23:00», но для гражданина США нормальным считается указание номера месяца в начале строки «01-25-2018 23:00».

Существенным вопросом является отображение даты согласно часовому поясу. Всё зависит от ряда условий. Если вы публикуете анонс на какое-либо событие, то скорее всего дата и время должны преобразовываться к локальному времени пользователя.

Решение ряда специфичных задач может приводить к непредсказуемым результатам. В некоторых отдельных странах существует процедура перехода на летнее время (англ. Daylight Saving Time, аббр. DST). Это в свою очередь порождает несуществующие промежутки времени или существующие два раза. Например, представьте, что сегодня в полночь будет перевод стрелок на час вперед. Если мы захотим узнать, сколько времени прошло с начала дня, то получим неверный результат. По факту не прошло ни минуты, но система измерения времени говорит о другом.На первый взгляд данная тема может показаться довольно простой. Каждый человек ежедневно имеет дело со временем. Мы умеем измерять его, определять разницу между началом и концом временного промежутка, знаем точную дату. На бытовом уровне все довольно просто. Однако манипулирование датами и временем в программном коде имеет свои особенности.

Приложение, написанное на PHP или любом другом языке программирования, обязательно столкнется с рядом существенных проблем. Вам необходимо учесть, в каких часовых поясах проживают пользователи, и к какому формату отображения времени они привыкли. Например, жители России используют запись дат в формате «25.01.2018 23:00», но для гражданина США нормальным считается указание номера месяца в начале строки «01-25-2018 23:00».

Существенным вопросом является отображение даты согласно часовому поясу. Всё зависит от ряда условий. Если вы публикуете анонс на какое-либо событие, то скорее всего дата и время должны преобразовываться к локальному времени пользователя.

Решение ряда специфичных задач может приводить к непредсказуемым результатам. В некоторых отдельных странах существует процедура перехода на летнее время (англ. Daylight Saving Time, аббр. DST). Это в свою очередь порождает несуществующие промежутки времени или существующие два раза. Например, представьте, что сегодня в полночь будет перевод стрелок на час вперед. Если мы захотим узнать, сколько времени прошло с начала дня, то получим неверный результат. По факту не прошло ни минуты, но система измерения времени говорит о другом.

Всемирное скоординированное время

Упростить работу c датами в PHP позволяет всемирное скоординированное время (англ. Universal Coordinated Time, аббр.UTC). Оно является своего рода эталоном измерения. UTC записывается в виде целочисленного значения. Это число не что иное, как количество секунд прошедших, начиная с 1 января 1970 года.

Началом точки отсчета берется часовой пояс, лежащий на долготе 0 градусов. От него отсчитываются другие часовые пояса с помощью положительного или отрицательного смещения. Например, UTC+3 соответствует часовому поясу столицы России.

Оперировать числовым представлением временной точки очень удобно. PHP имеет массу встроенных функций по работе с датами и временем. UTC-метка может быть легко преобразована в любой строковой формат даты. Обратное же требует больших усилий. Также вычисление продолжительности временного промежутка сводится к простой арифметической операции разности конечной точки и начальной.

//берем текущую временную метку и вычисляем ту, что
//существовала 99 дней, 36 минут и 12 секунд назад
$computedTime = time() - (12 + (36 * 60) + (86400 * 99));
echo date(DATE_COOKIE, $computedTime); //Saturday, 21-Oct-2017 14:35:17 EEST

Функции работы со временем и датой

Как было сказано выше, PHP имеет множество встроенных функций по обработке времени и даты. Доступны различные инструменты преобразования форматов, разделения дат на компоненты, сравнения и т.д.

Множество из этих функций чувствительны к настройкам часового пояса. Вы можете задать его в опции date.timezone конфигурационного файла php.ini, либо вызовом функции date_default_timezone_set(). Ознакомьтесь с примером, приведенным ниже. В нем наглядно демонстрируется, как происходит преобразование UTC-метки в форматированную строку и как меняется её значение в зависимости от часового пояса.

//сохраняем временную метку и форматируем
//её с различными настройкаи часовых поясов
$currentTime = time();

echo $currentTime .'<br>'; //1517141227
echo date(DATE_COOKIE, $currentTime).'<br>'; //Sunday, 28-Jan-2018 14:07:07 EET

date_default_timezone_set('Atlantic/Faroe');
echo $currentTime.'<br>'; //1517141227
echo date(DATE_RSS, $currentTime).'<br>'; //Sun, 28 Jan 2018 12:07:07 +0000

date_default_timezone_set('America/Denver');
echo $currentTime.'<br>'; //1517141227
echo date(DATE_ATOM, $currentTime).'<br>'; //2018-01-28T05:07:07-07:00

Заметка
Данный урок не ставит перед собой целей подробного рассмотрения функций работы с датами и временем. Материал по изучению этих возможностей будет разделен на несколько следующих статей.

Последние публикации