Независимо от того, какой сайт вы создаете, есть вероятность, что изрядное количество написанного вами кода будет включать форматирование и расчет даты и времени, потому что временные данные играют важную роль во многих сферах бизнеса и жизни.
Так что, как разработчик, вы должны хорошо разбираться в создании функций, которые выполняют такие задачи, как уведомление пользователя, о том сколько дней прошло с тех пор, как он в последний раз входил в систему, а также указание даты покупки на накладной клиента или получение списка статей, опубликованных на веб-сайте в течение последних 30 дней.
Язык PHP уже давно предоставляет мощные возможности для форматирования и манипулирования датой, что значительно сокращает объем работы, который разработчик должен сделать в этом направлении. В этой статье я познакомлю вас с некоторыми из наиболее часто используемых функций для работы с датой в PHP, и покажу несколько менее известных приемов.
Отображение даты
Функция date() в PHP является настолько впечатляющей, что многие учебники и часто используют функцию для вступительного примера, в качестве способа познакомить пользователя с простым, но мощным синтаксисом языка. Ошеломляющее количество параметров этой функции позволяет форматировать дату и время практически любым возможным образом (даже Swatch Internet Time, если вам так хочется). Например, для отображения текущей даты в формате, который не вызовет путаницы с порядком следования даты, зависящим от конкретной страны, вы можете использовать следующую последовательность параметров F j, Y:
1 2 3 |
<?php echo date("F j, Y"); ?> |
При выполнении фрагмента кода будет выведена следующая дата
January 2, 2010
Если ваши пользователи, находятся в Соединенных Штатах, то будет достаточно последовательности m-d-y:
1 2 3 4 |
<?php echo date("m-d-y"); // выводит 01-02-10 ?> |
Синтаксис форматирования, показанный здесь, это лишь малая часть того, что может делать функция date(). Не забудьте проверить документацию функции для уточнения всех деталей.
Форматирование временной отметки
Функция date() принимает дополнительный параметр, содержащий временную отметку. Временная отметка это просто представление определенной даты и времени, и, хотя временные отметки могут быть представлены с помощью различных форматов, функция date() ожидает, что дата должна быть задана в виде последовательности целых чисел, определяющих количество секунд, прошедших с момента начала эпохи Unix.
Это обычная практика для использования подобных временных отметок, и поэтому, если у вас есть под рукой дата, можно использовать функцию date(), чтобы преобразовать её в более удобный для пользователей формат. Например:
1 2 3 4 |
<?php $tstamp = "1032554992"; echo "The timestamp {$tstamp} represents the date/time: ". date("m-d-Y h:i:s", $tstamp); ?> |
При выполнении данного фрагмента кода получается следующий результат:
The timestamp 1032554992 represents the date/time: 09-20-2002 04:49:52
Локализация даты
Конечно, не все пользователи будут носителями английского языка. Таким образом, вы могли бы рассмотреть приветствия пользователей в более знакомом для их языка формате, который можно легко задать с помощью PHP функций setlocale() и strftime().
Например, если конкретный пользователь определил себя как гражданин Франции, вы могли бы локализовать специфичный синтаксис PHP с использованием локали fr_FR, а затем отформатировать дату, используя некоторые параметры функции strftime():
1 2 3 4 |
<?php setlocale(LC_TIME, "fr_FR"); echo strftime("%B %d, %Y"); ?> |
При выполнении данного фрагмента кода получается следующий результат:
02 janvier, 2010
В зависимости от того, как сконфигурирован ваш сервер, он может не поддерживать все доступные локали. Самый простой способ определить, поддерживается ли язык, это проверить возвращаемое значение функции setlocale(). Если функция возвращает FALSE, язык не поддерживается:
1 2 3 4 5 6 7 8 |
<?php $locale = setlocale(LC_TIME, "ru_RU"); if ($locale) { echo strftime("%B %d, %Y"); } else { echo strftime("%d %B, %Y"); } ?> |
Конфигурирование часового пояса
Веб-серверы часто находятся в разных часовых поясах с обслуживаемым бизнесом. Например, мои консультации и издательский бизнес находятся в городе Колумбус, штат Огайо (Eastern Standard Time), а веб-сайт размещен на сервере, расположенном в южной Калифорнии. Поскольку PHP по умолчанию будет сообщать время и дату в зависимости от конфигурации часового пояса сервера, и вы находитесь в ситуации, подобной моей, то вы должны настроить часовой пояс соответствующим образом.
Если вы хотите, чтобы все PHP-сценарии, находящиеся на сервере, использовали определенный часовой пояс, откройте файл php.ini и найдите директиву date.timezone. Вы можете установить эту директиву в любой из поддерживаемых PHP часовых поясов. Например, чтобы установить Восточной часовой пояс, я мог бы использовать настройку America/New_York:
date.timezone = 'America/New_York'
Если необходимо, чтобы только отдельный сценарий PHP использовал конкретный часовой пояс, то можете использовать функцию date_default_timezone_set() в начале вашего сценария:
1 2 3 |
<?php date_default_timezone_set('America/New_York'); ?> |
Если указать в конфигурационный файл сайта выше упомянутую функцию (date_default_timezone_set)
можно измежать такие ошибки как:Warning: date() : It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier.
Добавление 45 дней к дате
Предположим, у вас была поставлена задача создания сервиса загрузки видео, который предоставлял бы абоненту возможность загрузки видео в течение 60 дней с момента оплаты.
Из-за различного количества дней в каждом месяце, в сочетании с дополнительной сложностью определения високосного года, рассчитать срок окончания возможности загрузки может быть сложной задачей. Использование класса DateTime делает такой расчет очень простым:
1 2 3 4 5 6 |
<?php date_default_timezone_set('America/New_York'); $startDate = new DateTime('2010-01-02 00:00:00'); date_add($startDate, new DateInterval("P60D"); echo "< p>Your video download will expire on ".$startDate->format("m-d-Y")."</p>"; ?> |
Выполнение сценария дает следующий результат:
Your video download will expire on 04-02-2010.
Синтаксис формата DateInterval выглядит странно на первый взгляд; P означает период. Затем можно использовать другие обозначения периода, которые представляют собой гораздо больше, чем просто несколько дней. Например, чтобы определить, что прошло 2 года и 47 дней после указанной даты, можно использовать формат P2Y47D. Смотрите документацию по DateInterval для более подробной информации.
Вычисление количества дней между двумя датами
Футбольная команда Ohio State Buckeyes в последнее время взяла верх над своим главным соперником Michigan Wolverines, не проиграв ни одной игры с 22 ноября 2003 года. Предположим, вы создали сайт фанатов Ohio State Buckeyes и хотели бы приветствовать посетителей ведением счетчика количества дней, прошедших с последнего поражения Michigan Wolverines? Использование метода diff класса DateTime класса (доступного с PHP 5.3.1) делает задачу простой:
1 2 3 4 5 6 |
<?php date_default_timezone_set('America/New_York'); $loss = new DateTime('2003-11-22 00:00:00'); $days = $loss->diff(new DateTime('2010-01-02 00:00:00')); echo "< p>".number_format($days->days)." days have passed since OSU's last loss to Michigan! </p>"; ?> |
Выполнение сценария дает следующий результат:
2,233 days have passed since OSU's last loss to Michigan!