В избранное    Домой   

Вторник,  16 Apr 2024 г., 09:38
Любовь долготерпит, милосердствует, любовь не завидует, любовь не превозносится, не гордится, Не бесчинствует, не ищет своего, не раздражается, не мыслит зла, не радуется неправде, а сорадуется истине; Все покрывает, всему верит, всего надеется, все переносит. Любовь никогда не перестает, хотя и пророчества прекратятся, и языки умолкнут, и знание упразднится. /1-е коринфянам/

 Логин:  

 Пароль: 




Анонсы:
=== Дата: 17/08/2011     Автор: Крис Ньюман ===

PHP. Урок 9 Работа с временем и датой

Урок 9. Работа с временем и датой

В этом уроке вы научитесь сохранять, показывать и изменять значения даты и времени в PHP.

Формат даты

В PHP нет специального типа данных для хранения значения даты. Поэтому сначала нужно определиться с тем, как лучше хранить эти значения.

Выбор формата данных

Часто встречаются даты, записанные в структурированном виде. Например, 05/03/1974 или 2001-12-31. Такой формат не подходит для обработки даты. Но второй вариант удобней первого. В нем данные следуют в порядке важности — сначала год, потом месяц и затем день. Поэтому сравнить две даты можно с помощью стандартных операторов отношения в PHP.

Строка 2002-01-01 больше, чем 2001-12-31. Но так как операции сравнения быстрее работают с числами, лучше хранить данные в числовом виде. Например, 20020201; тогда формат будет YYYYMMDD. Его можно расширить для того, чтобы хранить время. Тогда формат примет следующий вид: YYYYMMDDHHMMSS. Как видим, все элементы расположены в порядке уменьшения веса.

К сожалению, такой формат не позволяет выполнять арифметические операции. Конечно, можно добавить один к 20040201, но если следующий календарный день относится к другому месяцу, получим бессмысленный результат. Например, добавив единицу к 20030531, получим бессмысленную дату — 32 мая.

Формат временной метки Unix

В формате временной метки Unix дата задается в целочисленном представлении. Его значение отсчитывается в секундах от полуночи 1 января 1970 года.

Начало эпохи Unix. Нулевая временная метка соответствуют 12 часам ночи 1 января 1970 года по гринвичскому поясу (GMT). Эта дата также называется началом эпохи Unix.

В данный момент дата и время состоят из десяти цифр в формате временной метки. Функция time позволяет определить текущее значение временной метки:

echo time();

Формат временной метки Unix очень удобен для расчетов, потому что время задается в секундах. Например, чтобы увеличить время на час, нужно прибавить 3600 секунд к значению временной метки. Если же прибавить 86400, время изменится на день. Потому что час состоит из 3600 секунд, а день – из 86400.

Но у этого формата есть один недостаток – нельзя работать с датами до 1970 года. Правда, на некоторых системах поддерживаются отрицательные значения временной метки, и можно обрабатывать даты до эпохи Unix. Но это работает не всюду, и лучше его не использовать.

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

Ограничение временной метки. Максимальное значение временной метки Unix зависит от архитектуры системы. Большинство систем использует 32-битное целое, чтобы хранить значение временной метки. Поэтому максимальное значение будет 3:14, 19 января 2038 года.

Работа с временной меткой

Иногда лучше использовать собственный формат даты, но в большинстве случаев подойдет формат временной метки. Рассмотрим, как с ним работать в PHP.

Форматирование даты

В уроке 1, "Знакомство с PHP", используется функция date. Она показывает текущую дату с форматированием, которое задается в аргументе:

echo date("j F Y H:i:s");

На выходе получим:

12 November 2004 10:23:55

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

echo date(“j F Y H:I:s”, 1000000000);

Коды форматирования для функции date перечислены в табл. 9.1.

Таблица 9.1. Коды форматирования для date

Код Описание
a am или pm в нижнем регистре
A AM или PM в верхнем регистре
d Двухзнаковый формат дня месяца, 03 - 31
D Трехбуквенное название дня недели, Mon – Sun
F Полное название месяца, January – December
g 12-часовой формат без нуля спереди для значения с одной цифрой, 1 – 12
G 24-часовой формат без нуля спереди для значения с одной цифрой, 0 – 23
h 12-часовой формат с нулем спереди для значения с одной цифрой, 01 – 12
H 24-часовой формат с нулем спереди для значения с одной цифрой, 00 – 23
I Минуты с нулем спереди, 01 – 12
j День месяца без нуля спереди, 1 – 31
l Полное название дня недели, Monday – Sunday
m Номер месяца с нулем спереди, 01 – 12
M Трехбуквенное название месяца, Jan – Dec
n Номер месяца без нуля спереди, 1 – 12
s Секунды с нулем спереди, 00 – 59
S Порядковый суффикс для дней месяца: st, nd, rd или th
w Номер дня недели, 0 – 6, где 0 – воскресенье
W Номер недели в году, 0 – 53
y Двухзнаковый год
Y Четырехзнаковый год
z День года, 0 – 365

Перевод в формат временной метки

Для того чтобы узнать значение временной метки для нужной даты, в PHP есть готовая функция mktime, которая рассчитывает его на основе заданной даты и времени.

Порядок аргументов следующий: час, минуты, секунды, месяц, день и год. В примере ниже переменной $timestamp присваивается значение временной метки, которое соответствует 25 декабрю 2001 года в 8 часов утра:

$timestamp = mktime(8, 0, 0, 12, 25, 2001);

Формат временной метки Unix начинается с1 января 1970 года в полночь по GMT. Функция mktime возвращает значение метки на основе часового пояса, который установлен на Web-сервере. Например, mktime с одинаковыми параметрами аргумента для Техаса вернет значение временной метки на 3600 больше, чем для компьютера в Нью-Йорке.

Безопасное дневное время. Если формат временной метки используется для хранения даты, то три первых аргумента mktime влияют на значение только в полночь, когда время может изменить дату.
Например, переводя часы на час назад и добавив при этом к значению временной метки 86400 секунд, получим прибавку в два дня. Чтобы этого избежать, лучше использовать полдень вместо полночи.

Среднее время по гринвичскому меридиану. Функция gmmktime возвращает время в формате временной метки относительно GMT (Лондонское время, где используется безопасное дневное время).

Функция mktime – нестрогая и позволяет вводить бессмысленные аргументы. Например, несуществующий день месяца. Если попытаться узнать значение временной метки для 29 февраля в невисокосном году, на выходе получим значение для 1 марта:

echo date("d/m/y", mktime(12, 0, 0, 2 , 29, 2003));

Это позволяет выполнять различные арифметические опреции с датой и временем. В примере ниже рассчитывается и выводится дата и время для 37 часов после полудня 30 декабря 2001 года:

$time = mktime(12 + 37, 0, 0, 12, 30, 2001);
echo date("d/m/y H:i:s", $time);

Просто прибавляя нужное значение к одному из аргументов в mktime, можно смещать искомое значение временной метки. На выходе получим следующий вид для даты и времени:

01/01/2002 01:00:00

В этой дате корректно сместились все значения: день, месяц, год и время. Здесь учитывается то, что декабрь последний месяц в году, и количество дней в нем.

Значение даты в формате DD-MM-YYYY легко перевести в формат временной метки. Для этого нужно выделить значения между дефисами. Функции explode передается символ-разделитель и строка, которую нужно разбить на части. На выходе получим массив выделенных значений.

В примере ниже значение даты разбивается на компоненты, и рассчитывается значение временной метки:

$date = "03-05-1974";
$parts = explode("/", $date);
$timestamp = mktime(12, 0, 0,
        $parts[1], $parts[0], $parts[2]);

Функция strtotime позволяет автоматически получать значение временной метки из различных форматов представления даты. Вот примеры для различных форматов даты:

$timestamp = strtotime("3 May 04");
$timestamp = strtotime("3rd May 2004");
$timestamp = strtotime("May 3, 04");
$timestamp = strtotime("3-May-04");
$timestamp = strtotime("2004-05-03");
$timestamp = strtotime("05/03/2004");

Нужно помнить, что в последнем примере формат имеет вид MM/DD/YYYY, а не DD/MM/YYYY.

Получение информации из значения временной метки

Можно использовать функцию date, чтобы узнать часть или всю информацию о дате на основе значений временной метки. Но в PHP для этих целей есть специальная функция getdate, которая возвращает различные параметры на основе значений временной метки.

Функции getdate передается значение временной метки, а на выходе получаем ассоциированный массив с ключами, которые перечислены в табл. 9.2.

Таблица 9.2. Значения ключей, возвращаемых функцией getdate

Ключ Описание
seconds Секунды, 0 – 59
minutes Минуты, 0 – 59
hours Часы, 0 – 23
mday День месяца, 1 – 31
wday День недели, 0 – 6, где 0 – воскресенье
yday День года, 0 – 365
mon Номер месяца, 1 – 12
year Четырехзнаковый год
weekday Полное название дня недели, Sunday – Saturday
month Полное название месяца, January – December

В примере ниже функция getdate определяет, будний или выходной день:

$now = getdate();
switch ($now["wday"]) {
    case 0: // Воскресенье
    case 6: // Суббота
    echo "Это выходной";
    break;
    default: echo "Это рабочий день";
}

Нужно помнить, что getdate без аргумента возвращает массив с индексами из табл. 9.2 для текущего времени.

Резюме

В этом уроке вы узнали, как работать со значениями даты и времени в PHP. В следующем уроке вы узнаете о классах в PHP и о том, как использовать библиотеки классов от сторонних разработчиков.


<<назад

Погода в Рудне
(Волгоградcкая обл.)

Подробнее >>