Функции работы с датами и временем
Формирование календаря на месяц
В распределенных системах, таких как Интернет, время играет особую роль. Из-за
незначительного расхождения системных часов игрок на рынке Forex может потерять десятки тысяч долларов в течение нескольких минут; система деловой разведки ошибется в построении прогноза; серверы NNTP в процессе синхронизации
потеряют важную информацию, нужную пользователям, и т. д. Кроме того, поскольку Сеть окутала всю планету, неизбежно возникают вопросы, связанные с особенностями представления времени и даты в той или иной географической или
языковой зоне. И все это вы должны учитывать при построении полноценного РНР-приложения.
Именно поэтому я постарался уделить достаточно внимания использованию
средств работы с датой и временем, реализованных в РНР.
13.1.1. Проверка правильности даты: checkdate
int checkdate (int month, int day, int year)
Функция возвращает true, если переданная ей дата является правильной. В противном случае результат равен false. Фактически функция полагает, что дата
правильная, в случае если аргументы функции удовлетворяют следующим требованиям.
- Год (year) имеет значение в диапазоне от1до 32 767 включительно и является целым числом.
- Месяц (month) представляет собой целое число в диапазоне от1 до 12.
- День месяца (day) должен представлять собой целое число, не превышающее
общего количества дней в данном месяце. При этом функция корректно обрабатывает и високосные годы.
13.1.2. Форматирование даты и времени: date
string date (string format [, int timestamp])
Возвращает строку, отформатированную в соответствии с заданным форматом.
Дата выводится либо для заданной метки времени titpestamp, либо для текущего
времени, если этот аргумент не задан.
Форматная строка может содержать следующие символы:
а | Формат «am» или «рm»
| А | Формат «AM» или «РМ»
| В | Формат Swatch Internet time
| d | День месяца в виде двух цифр с ведущим нулем (01-31)
| D | День недели в текстовом виде, например «Thu»
| F | Название месяца в длинном формате, например «September»
| g | Часыв 12-часовомформатебезведущихнулей,тоестьот«1»до«12»
| G | Часы в 24-часовом формате без ведущих нулей, то есть от «О» до «23»
| h | Часы в 12-часовом формате от «01» до «12»
| Н | Часы в 24-часовом формате от «00» до «23»
| i | Минуты от «00» до «59»
| I | «1» при включенном декретном времени и «О» при выключенном
| j | День месяца без ведущих нулей, то есть от «1»до «31»
| l | День недели в длинном формате, например «Thursday»
| L | Логическое значение, указывающее, является ли выводимый год високосным («О» или «1»)
| m | Номер месяца в диапазоне от «01» до «12»
| М | Текстовое сокращение названия месяца, например «Sep»
| n | Номер месяца без ведущих нулей, то есть с«1»по«12»
| r | Дата в формате RFC 822, то есть «Thu, 21 Dec 2000 16:01:07 +0200»
| s | Секунды, от «00» до «59»
| S | Суффикс числительных для английского языка («th», «nd»). Русскому человеку он ни к чему, хотя вы можете реализовать его эквивалент путем контекстной замены полученной строки, например «2nd» на «2ое». Выглядеть будет очень колоритно и, главное, понятно...
| t | Количество дней в данном месяце, от «28» до «31»
| Т | Установка временной зоны для данной машины, например «MSD»
| U | Секунды, прошедшие с начала эпохи
| w | День недели в числовом формате, начиная с «О» (воскресенье) до «6» (суббота)
| Y | Год в четырехцифровом формате, например «2001»
| у | Год, записанный двумя цифрами, например «01»
| z | Номер текущего дня года, от «О» до «365»
| Z | Сдвиг временной зоны в секундах (от «-43 200» до «43 200»). Смещение на запад от UTC (он же Гринвич) всегда отрицательное, а на восток — положительное. Москва, например, находится на четыре часа восточнее
|
Все символы формата, которые не распознаются как управляющие коды форматирования, печатаются без изменения. По умолчанию РНР использует локаль С, которая не подозревает о существовании русских названий месяцев и дней недели.
Чтобы заставить систему печатать дату по-русски, вы должны предварительно активизировать русскую локаль с помощью вызова setlocale() (см. раздел 11.3.2)
и использовать функцию strf time О (раздел 13.1.11).
Вот как эта функция используется на практике:
// Буржуйский подход из документации к РНР
print (date ("l dS of F Y h:i:s A")); print ("July 1, 2000 is on a " . date ("l", mktime(0,0,0,7,1,2000)));
// Наш подход, с учетом кириллицы
setlocale('LC_ALL','ru_RU.KOI8-R');
echo "Текущее время: ";
echo strftime("%d %B %Y, %H:%M:%S %Z, %A");
Можно также использовать совместно функции date() Hmktime() (см. раздел 13.1.10),
чтобы определить день недели на любую дату в прошлом и будущем. Вполне очевидное применение этой комбинации — построение календаря, о чем мы поговорим в разделе 13.2:
$tomorrow = mktime (0,0,0,date("m") , date("d")+1, date("Y"));
$lastmonth = mktime (0,0,0,date("m") -1 ,date("d") , dateC'Y"));
$nextyear = mktime (0,0,0,date("m") , date('d"), date("Y")+1) :
С целью закрепления материала взгляните на следующую программу. В ней мы
попробуем отформатировать текущую дату несколькими способами и посмотрим,
что из этого выйдет. В листинге 13.1 приведена программа, которая пытается проверить работу нескольких форматов.
Листинг 13.1. Форматирование даты
<HTHL>
<TITLE Форматирование даты</ТIТLЕ>
<BODY BGCOLOR="#FFFFFF">
<font size=+l>
<table border=l>
<tr>
<th>Локаль</th><th>Cтpoкa форматирования </th><th>Peзyльтaт</th>
</tr>
?>
// Определяем строки форматирования
$frm = arrayC'F j , Y, g:i a" , "m.d.y" , " j , g, Y","Ymd",
'h-i-s, j-m-y, it is w Day z ',
'\i\t \i\s \t\h\e jS \d\a\y. ' ,
"D M j G:i:s Т Y", 'H:m:s \m \i\s\ \m\o\n\t\h1
" H : i : s " ) ;
foreach ($frm as $key) {
$today = date($key); // Форматируем дату
echo "<tr><td>C</td><td>$key</td><td>$today</td><tr>\n"
echo "<tr><td> </td><td> </td><td> </td></tr>" ;
// Включаем локаль
set locale ('LC_ALL' , ' ru_RU.KOI8-R' ) ;
// И еще раз повторяем все то же самое, но для русской локали
foreach ($frm as $key) {
Stoday = date(Skey); // Форматируем дату
echo "<tr><td>ru_RU</td><td>$key</td><td>$today</td><tr>\n"
}
?>
</table>
<p>
<?
// Убеждаемся в принципиальной возможности вывода русской даты
echo strftime("%d %B %Y, %H:%M:%S %Z, %A"); ?>
Результат выполнения этой программы представлен на рис. 13.1.
Как можно увидеть из рисунка, функция date игнорирует установку локали, а стало
быть, имеет весьма ограниченную применимость.
См. также описания gmdate() (раздел 13.1.5) и mktime () (раздел 13.1.10).
Рис. 13.1. Функция date игнорирует стандартные установки локали
13.1.3. Считывание информации о дате и времени: getdate
array getdate ([int timestamp])
Функция возвращает ассоциативный массив, содержащий информацию по задан-
ной дате (аргумент timestamp) или по текущей дате, если аргумент не задан. Массив содержит следующие элементы:
seconds | Секунды
| minutes | Минуты
| hours | Часы
| mday | День месяца
| wday | День недели в числовом формате (от 0 до 6), начиная с воскресенья
| year | Год, число
| yday | Номер дня года, от 0 до 365
| weekday | Полное название дня недели, например «Friday»
| month | Полное название месяца, например «January»
|
Эта функция, так же как и date (), напрочь игнорирует настройки локали, поэтому последние два элемента массива имеют весьма ограниченную ценность. Вот
пример использования функции getdate ():
$today = getdate() ;
$month = $today['month'];
$mday = $today['mday'];
$year = $today['year'];
echo "$month $mday, $year";
|