ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Работа с датой и временем. Получение даты и времени средствами PHP

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

Использование функции date()

Функция date() принимает два параметра, один из которых является необязательным. Первый параметр задает строку формата, а второй, необязательный, — метку времени Unix. Если метка времени не указана, то по умолчанию функция date() обрабатывает текущую дату и время. Она возвращает отформатированную строку, содержащую дату.

Типичный вызов функции выглядит следующим образом:

echo date('jS F Y');

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

Таблица. Коды форматирования PHP-функции date()
Код Описание
a Время до или после полудня, представленное двумя строчными буквами: am или pm
A Время до или после полудня, представленное двумя прописными буквами: AM или PM
B Интернет-время Swatch —универсальная временная схема. Более подробно о ней можно узнать на сайте http://www.swatch.com
c Дата в соответствии со стандартом ISO 8601. Дата представлена в виде ГГГГ-MM-ДД. Прописная буква Т отделяет дату от времени. Время представлено в виде ЧЧ-ММ-СС. Завершает строку часовой пояс, представленный как смещение от среднего времени по Гринвичу, например, 2011-03-17Т16:08:42 + 2:00
d День месяца в виде двузначного числа с ведущим нулем. Диапазон значений —от 01 до 31.
D День недели в виде английской трехбуквенной аббревиатуры. Диапазон значений — от Mon (понедельник) до Sun (воскресенье).
F Полное английское название месяца. Диапазон значений — от January (январь) до December (декабрь).
g Часы в 12-часовом формате без ведущих нулей. Диапазон значений —от 1 до 12.
G Часы в 24-часовом формате без ведущих нулей. Диапазон значений —от 0 до 23.
h Часы в 12-часовом формате с ведущими нулями. Диапазон значений —от 01 до 12.
H Часы в 24-часовом формате с ведущими нулями. Диапазон значений —от 00 до 23.
i Минуты с ведущими нулями. Диапазон значений от 00 до 59.
I Признак применения летнего времени, представленный логическим значением. Если летнее время, возвращается значение 1, иначе 0.
j День месяца в виде числа без ведущих нулей. Диапазон значений от 1 до 31.
l Полное английское название недели. Диапазон значений от Monday (понедельник) до Sunday (воскресенье).
L Високосный год, представленный логическим значением. Возвращает значение 1, если дата принадлежит високосному году, и 0 в противном случае.
m Номер месяца в двузначном числовом формате с ведущими нулями. Диапазон значений от 01 до 12.
M Месяц в виде английской трехбуквенной аббревиатуры. Диапазон значений от Jan (январь) до Dec (декабрь).
n Номер месяца без ведущих нулей. Диапазон значений от 1 до 12.
O Разница между текущим часовым поясом и GMT в часах, например, +1600.
r Дата и время в формате, заданном в RFC822, например, Wed, 9 Jun 2011 18:45:30 + 1600
s Секунды с ведущими нулями. Диапазон значений от 00 до 59.
S Порядковый суффикс для дат в двубуквенном формате. Он может принимать значение st, nd, rd или th в зависимости от числа, за которым следует.
t Полное количество дней в месяце даты. Диапазон значений от 28 до 31.
T Часовой пояс сервера в трехбуквенном формате, например, EST.
U Число секунд с 1 января 1970 года до текущего момента; его также называют меткой времени Unix для текущей даты.
w Номер дня недели в виде однозначного числа. Диапазон значений от 0 (воскресенье) до 6 (суббота).
W Номер недели в году в формате ISO-8601.
y Год в двузначном формате, например, 11.
Y Год в четырехзначном формате, например, 2011.
z День года в виде числа.Диапазон значений от 0 до 365.
Z Смещение текущего часового пояса в секундах. Диапазон значений от -43200 до 43200.

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

Второй параметр функции date() является меткой времени Unix. Для тех, кому интересно, что это значит: большинство Unix-систем хранят текущее время в виде 32-разрядного целого числа секунд, начиная с полуночи 1 января 1970 года по Гринвичу. Эту дату еще называют началом эпохи Unix. Для непосвященных это выглядит несколько эзотерично, но таков стандарт, к тому же такие значения легко обрабатываются компьютером.

Метки времени Unix —компактный способ хранения даты и времени, и стоит отметить, что на него совершенно не повлияла проблема 2000 года, от которой пострадали другие сокращенные форматы хранения даты. Но для программного обеспечения, которое доживет до 2038 года, возникнет аналогичная проблема. Поскольку метки времени не имеют своего фиксированного размера, но они жестко привязаны к размеру длинного целого в языке С (32 бита), то, скорее всего, к 2038 году компиляторы будут использовать более емкий тип. Проблемы будут возникать, если программное обеспечение имеет дело с датами до 1902 и после 2038 года.

Даже если PHP запускается на Windows-сервере, все равно функция date() и многие другие PHP-функции используют именно этот формат хранения даты, принятый для Unix. Одно отличие состоит в том, что в случае с Windows значения метки времени должны быть положительными.

Если требуется преобразовать время и дату в формат метки времени Unix, можно воспользоваться функцией mktime(), которая имеет следующий прототип:

int mktime (int hour [, int mimute[, int second[, int month[, int day[, int year [, int is_dst ] ] ] ] ] ] )

Назначение всех аргументов вполне очевидно, кроме последнего, is_dst, который указывает, действует ли переход на летнее время. Его можно установить равным 1, если переход на летнее время действует, 0, если нет, либо -1 (значение по умолчанию), если это неизвестно. Этот аргумент является необязательным и поэтому используется редко.

Основная опасность, которой следует избегать при использовании функции mktime() —достаточно неинтуитивный порядок следования аргументов. Он не позволяет пропустить время. Если время не важно, можно задать часы, минуты и секунды равными 0. Однако можно опустить значения в конце списка параметров. Незаданные величины будут взяты взяты из текущего времени. Следовательно вызов функции:

$timestamp = mktime();

вернет метку времени Unix для текущей даты и времени. Конечно тот же результат можно получить и с помощью такого вызова:

$timestamp = time();

Функция time() не принимает параметров и всегда возвращает метку времени Unix для текущей даты и времени.

Другой возможностью является применение функции date(), как только что упоминалось. Строка формата "U" запрашивает метку времени. Показанный ниже оператор эквивалентен двум предыдущим:

$timestamp = date("U");

В функцию mltime() можно передать год как в двух, так и в четырехзначном формате. Двузначные значения от 0 до 69 интерпретируются как годы от 2000 до 2069, а 70-99 — как годы от 1970 до 1999.

Ниже представлены другие примеры использования функции mktime().

$time = mktime(12, 0, 0);

дает полдень для текущей даты.

$time = (0, 0, 0, 1, 1);

дает 1 января текущего года.

Функцию mktime() можно также применять для простых арифметических вычислений над датами. Например:

$time = mktime(12, 0, 0, $mon, $day+30, $year);

добавляет 30 дней к дате, указанной переданными в функцию компонентами, даже если ($day+30) обычно будет больше количества дней в месяце.

Чтобы избежать некоторых проблем, связанных с летним временем, рекомендуется использовать вместо 0 часов 12 часов. Если вы добавите (24*60*60) к полуночи в 25 часовом дне, вы останетесь в рамках того же дня. Если вы добавите то же значение к полудню, вы получите 11 утра, но по крайней мере, будите иметь дело с корректным днем.

Использование функции getdate()

Другая полезная функция определения даты — функция getdate(). Она имеет следующий прототип:

array getdate ([ int timestamp])

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

Располагая всеми частями этого массива, вы можете получить из него любой требуемый формат представления. Элемент метки времени (0) может показаться излишним, однако, если вызвать функцию getdate() без параметров, в него будет занесена текущая метка времени.

Таблица. Ассоциированный массив пар клю-значение, возвращаемый функцией getdate()
Ключ Значение
seconds Секунды, числовое значени.
minutes Минуты, числовое значение.
hours Часы, числовое значение.
mday День месяца, числовое значение.
wday День недели, числовое значение.
mon Месяц, числовое значение.
year Год, числовое значение.
yday День года, числовое значение.
weekday День недели, полное английское название.
month Месяц, полное английское название.
0 Метка времени, числовое значение.

Проверка правильности дат

Для проверки правильности дат можно воспользоваться функцией checkdate(). Это особенно полезно при проверке дат, вводимых пользователем. Функция checkdate() имеет следующий прототип:

int checkdate (int month, int day, int year)

Она проверяет, является ли год целым числом от 0 до 32767, месяц — целым от 1 до 12,и что указанное число существует в заданном месяце. Эта функция учитывает и високосные годы.

Например:

checkdate (9, 18, 1972);

вернет значение true, а

checkdate (9, 31, 2000);

значение false.