Мы уже использовали функцию date ( ) в нескольких примерах, но она заслу
живает более детального рассмотрения. Функция date ( ) возвращает информа
цию о дате и времени в формате, продиктованном ее аргументами. Однако
просто удивительно, как поразному это можно использовать:
date("formatting");
В главе 6 было показано, что функция date ( " А " ) ; возвращает значения AM
и РМ. Список форматов даты полностью приведен в табл. С.5 (приложение С).
Эти параметры можно комбинировать, например функция date(" 1 F j , Y") ;
возвратит значение Friday January 26,2001.
Функция date ( ) может принимать еще один аргумент, называемый времен
ной меткой. Временная метка — это число, обозначающее количество секунд,
прошедших с первой секунды 1 января 1970 года с начала отсчета времени во
всех системах Unix. Как говорилось в главе 12, функция time() возвращает
значение временной метки на текущий момент. Функция mktime () может воз
вращать значение временной метки на конкретное время и дату:
mkt ime(час,минута,секунда,месяц,день,год);
Например, строка кода $Timestamp=mktime (12, 30, 0, 12, 27, 1997); при
своит переменной $Timestamp количество секунд от точки начала о.тсчета вре
мени до 12:30 27 декабря 1997 года. Затем это значение может быть отправле
но в функцию date ( " D " , $ Times tamp) ;, которая возвратит значение Sat
трехбуквенный формат для обозначения дней недели.
Давайте создадим интерактивный календарь посредством функций date ()
и mkt ime ( ) , которые будут использованы много раз.
Использование функции date
- Создайте новый PHPдокумент в текстовом редакторе.
- Присвойте переменной $PageTitle значение, включите файл заголовка.
- Раз уж мы разработали дизайн сайта и создали необходимые включаемые
файлы, будем использовать их и дальше. Присвойте переменным $Month
и $Year значения по умолчанию, если они не еще не определены. - Создайте временную метку, относящуюся к конкретному месяцу и году.
- Определите полное название месяца.
- Создайте таблицу для размещения календаря на экране.
- Напечатайте заголовок с указанием месяца и года.
- Наберите дни недели.
- Определите первый день недели для этого месяца.
- Проследите, чтобы значение переменной $MonthStart не было нулевым.
- Определите последний день месяца.
- Задайте начальную дату как первый день месяца.
- Напишите цикл, который станет печатать строки календаря (недели).
- Создайте второй цикл, который будет печатать колонки календаря (дни).
- Увеличьте значение переменной $StartDate на единицу.
- Создайте условную конструкцию for, которая будет определять, когда пе
чатать строку $StartDate. - Закройте второй цикл, строку таблицы и первый цикл.
- Закончите таблицу.
- А теперь сделаем простую HTMLформу, которая передает страницу об
ратно в себя. - Создайте два ниспадающих меню: одно для месяца, другое для года.
- Создайте кнопку Submit и закройте форму.
- Включите файл нижнего колонтитула и закройте тэг РНР.
- Сохраните сценарий как calendar.php (листинг 13.5), загрузите его на сер
вер и протестируйте в браузере (рис. 13.6 и 13.7).
< ?php
SPageTitle = "Calendar";
require ("header.php");
if ((!$Month) && (!$Year)) {
$Month = date ("m");
$Year = date ( " Y " ) ;
Когда пользователь обращается к этому ресурсу в первый раз, значения ме
сяца или года не передаются на страницу. РНР использует текущий месяц (на
пример, 1) и год (например, 2001).
$Timestamp = mktime ( О , О, О, $Month, I, $Year);
Для получения временной метки мы задаем в функции mktime ( ) нули для
часов, минут и секунд и единицу для дней. Месяц и год будут взяты из соответ
ствующих переменных.
$MonthName = dateC'F", $Timestamp) ;
Если задать значение первого аргумента как F, функция date ( ) возвратит
название месяца (например, January).
print ("<TABLE BORDER=0 CELLPADDING=3 CELLSPACING=0 ALIGN=CENTER>");
print ("<TR BGCOLOR=BLUExTD COLSPAN=7 ALIGN=CENTER>
<FONT COLOR=WHITExB>$MonthName $Year</Bx/FONTx/TDx/TR>") ;
print ("<TR BGCOLOR=BLUExTD ALIGN=CENTER WIDTH=20xB>
<FONT COLOR=WHITE>Su</FONTx/Bx/TDxTD ALIGN=CENTER WIDTH=20xB>
<FONT COLOR=WHITE>M</FONTx/Bx/TDxTD ALIGN=CENTER WIDTH=20xB>
<FONT COLOR=WHITE>Tu</FONTx/Bx/TDxTD ALIGN=CENTER WIDTH=20xB>
<FONT COLOR=WHITE>W</FONTx/Bx/TDxTD ALIGN=CENTER WIDTH=20xB>
~<FONT COLOR=WHITE>Th</FONTx/Bx/TDxTD ALIGN=CENTER WIDTH=20xB>
<FONT COLOR=WHITE>F</FONTx/Bx/TDxTD ALIGN=CENTER WIDTH=20xB>
<РОЙТ COLOR=WHITE>Sa</FONTx/Bx/TDx/TR>/n") ;
Если внутри печатаемого текста нет переменных, а он очень длинный, ис
пользуйте одинарные кавычки. Тогда можно свободно вставлять новые стро
ки, так что видеть коды РНР и HTML будет легче.
$MonthStart = dateC'w", $Timestamp) ;
Эта строка присвоит значение дня недели (в цифровой форме от 0 до 6)
переменной $MonthStart для месяца и года. Так как первый день месяца был
использован при задании временной метки, данный код определит этот кон
кретный день. Таким образом удастся узнать, с какого дня недели начинается
месяц: с понедельника, вторника и т.д.
if ($MonthStart == 0) {
$MonthStart = 7;
}
Если значение переменной $MonthStart равно нулю, это означает, что ме
сяц начинается с воскресенья и у нас будут проблемы с использованием данно
го числа при выполнении сценария. Чтобы избежать проблем, заменим ноль
семеркой.
$LastDay = date("d", mktime (0, 0, 0, $Month+l, 0, $Year)) ;
Переменной $LastDay будет присвоено цифровое значение (например, 31,
28 или 30), равное последнему дню месяца. Это определено использованием
нулевого дня и следующего месяца ($Month+l) в функции mktime (}.
$StartDate = $MonthStart;
Так как календарь будет начинаться с воскресенья, необходимо опреде
лить, какое количество дней пропустить до первого дня месяца. Если первый
день месяца вторник, значение $MbnthStart равно 2, следовательно, значе
ние $startDate равно 2, то есть будут созданы два пустых дня до начала ме
сяца.
for ($k = 1; $k <= 6; $k++) {
print ("<TR BGCOLOR=WHITE>");
В календаре будет 6 строк, поэтому цикл исполнит этот раздел кода 6 раз.
for ($i = 1; $i <= 7; $i++) {
В календаре будет 7 колонок, одна на каждый день недели.
$StartDate++;
Значение переменной $startDate печатает дату для каждого дня календа
ря. Поэтому любая итерация цикла увеличивает это значение.
if (($StartDate <= 0) | | ($StartDate > $LastDay)) {
print ("<TD BGCOLOR=GREEN> </TD>");
} el'seif (($StartDate >= 1) && ($StartDate <= $LastDay)) {
print ("<TD ALIGN=CENTER>$StartDate</TD>");
}
Если значение переменной $StartDate меньше нуля (другими словами, ме
сяц еще не начался) или больше количества дней в месяце ($LastDate), на эк
ране монитора будет отображена пустая зеленая область. В том случае если
значение переменной $StartDate больше нуля, но меньше количества дней
в месяце ($LastDate), будет напечатана дата.
}
print ("</TR>n");
}
print ("</TABLE>n");
print ("<FORM ACTION="calendar.php" METHOD=GET>n");
print ("Select a new month to view:n");
print ("<SELECT NAME=Month>
<OPTION VALUE=l>January</OPTION>n
<OPTION VALUE=2>February</OPTION>n
<OPTION VALUE=3>March</OPTION>n
<OPTION VALUE=4>April</OPTION>n
<OPTION VALUE=5>May</OPTION>n
«DPTION VALUE=6>June</OPTION>n
<OPTION VALUE=7>July</OPTION>n
<OPTION VALUE=8>August</OPTION>n
<OPTION VALUE=9>September</OPTION>n
«DPTION VALUE=10>October</OPTION>n
<OPTION VALUE=ll>November</OPTION>n
<OPTION VALUE=12>December</OPTION>n</SELECT>n") ;
print ("<SELECT NAME=Year>
<OPTION VALUE=2001>2001</OPTION>n
<OPTION VALUE=2002>2002</OPTION>n
<OPTION VALUE=2003>2003</OPTION>n
</SELECT>n");
Вы можете задать здесь любые годы. Обратите внимание, что два представ
ленных меню сгенерируют переменные $Month и $Year, как только форма
будет передана. И с этого времени благодаря условной конструкции, начина
ющейся со строки 5, новые значения будут использоваться вместо значений по
умолчанию.
print •("< INPUT TYPE=SUBMIT NAME=SUBMIT VALUE="Submiti">n");
print ("</FORM>n");
require ("footer.php");
?>
Вместо определения последнего дня месяца, как мы сделали на строке 20 (обра
тившись к нулевой секунде первого дня следующего месяца), можно использовать
формат date (” t ” ) ; , который возвращает количество дней в месяце. Для исполь
зования этого нового значения придется слегка изменить сценарий.