PHP-4 Эффективная работа


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

В распределенных системах, таких как Интернет, время играет особую роль. Из-за незначительного расхождения системных часов игрок на рынке Forex может потерять десятки тысяч долларов в течение нескольких минут; система деловой разведки ошибется в построении прогноза; серверы NNTP в процессе синхронизации потеряют важную информацию, нужную пользователям, и т. д. Кроме того, поскольку Сеть окутала всю планету, неизбежно возникают вопросы, связанные с особенностями представления времени и даты в той или иной географической или языковой зоне. И все это вы должны учитывать при построении полноценного РНР-приложения.

Именно поэтому я постарался уделить достаточно внимания использованию средств работы с датой и временем, реализованных в РНР.

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

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";
назад
далее

Сайт управляется системой uCoz