Поиск

Определение даты и времени

Мы уже использовали функцию 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

  1. Создайте новый PHPдокумент в текстовом редакторе.
  2. < ?php
  3. Присвойте переменной $PageTitle значение, включите файл заголовка.
  4. SPageTitle = "Calendar";
    require ("header.php");
  5. Раз уж мы разработали дизайн сайта и создали необходимые включаемые файлы, будем использовать их и дальше. Присвойте переменным $Month и $Year значения по умолчанию, если они не еще не определены.
  6. if ((!$Month) && (!$Year)) {
    $Month = date ("m");
    $Year = date ( " Y " ) ;

    Когда пользователь обращается к этому ресурсу в первый раз, значения ме сяца или года не передаются на страницу. РНР использует текущий месяц (на пример, 1) и год (например, 2001).

  7. Создайте временную метку, относящуюся к конкретному месяцу и году.
  8. $Timestamp = mktime ( О , О, О, $Month, I, $Year);

    Для получения временной метки мы задаем в функции mktime ( ) нули для часов, минут и секунд и единицу для дней. Месяц и год будут взяты из соответ ствующих переменных.

  9. Определите полное название месяца.
  10. $MonthName = dateC'F", $Timestamp) ;

    Если задать значение первого аргумента как F, функция date ( ) возвратит название месяца (например, January).

  11. Создайте таблицу для размещения календаря на экране.
  12. print ("<TABLE BORDER=0 CELLPADDING=3 CELLSPACING=0 ALIGN=CENTER>");
  13. Напечатайте заголовок с указанием месяца и года.
  14. print ("<TR BGCOLOR=BLUExTD COLSPAN=7 ALIGN=CENTER>
    <FONT COLOR=WHITExB>$MonthName $Year</Bx/FONTx/TDx/TR>") ;
  15. Наберите дни недели.
  16. 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 будет легче.

  17. Определите первый день недели для этого месяца.
  18. $MonthStart = dateC'w", $Timestamp) ;

    Эта строка присвоит значение дня недели (в цифровой форме от 0 до 6) переменной $MonthStart для месяца и года. Так как первый день месяца был использован при задании временной метки, данный код определит этот кон кретный день. Таким образом удастся узнать, с какого дня недели начинается месяц: с понедельника, вторника и т.д.

  19. Проследите, чтобы значение переменной $MonthStart не было нулевым.
  20. if ($MonthStart == 0) {
    $MonthStart = 7;
    }

    Если значение переменной $MonthStart равно нулю, это означает, что ме сяц начинается с воскресенья и у нас будут проблемы с использованием данно го числа при выполнении сценария. Чтобы избежать проблем, заменим ноль семеркой.

  21. Определите последний день месяца.
  22. $LastDay = date("d", mktime (0, 0, 0, $Month+l, 0, $Year)) ;

    Переменной $LastDay будет присвоено цифровое значение (например, 31, 28 или 30), равное последнему дню месяца. Это определено использованием нулевого дня и следующего месяца ($Month+l) в функции mktime (}.

  23. Задайте начальную дату как первый день месяца.
  24. $StartDate = $MonthStart;

    Так как календарь будет начинаться с воскресенья, необходимо опреде лить, какое количество дней пропустить до первого дня месяца. Если первый день месяца вторник, значение $MbnthStart равно 2, следовательно, значе ние $startDate равно 2, то есть будут созданы два пустых дня до начала ме сяца.

  25. Напишите цикл, который станет печатать строки календаря (недели).
  26. for ($k = 1; $k <= 6; $k++) {
    print ("<TR BGCOLOR=WHITE>");

    В календаре будет 6 строк, поэтому цикл исполнит этот раздел кода 6 раз.

  27. Создайте второй цикл, который будет печатать колонки календаря (дни).
  28. for ($i = 1; $i <= 7; $i++) {

    В календаре будет 7 колонок, одна на каждый день недели.

  29. Увеличьте значение переменной $StartDate на единицу.
  30. $StartDate++;

    Значение переменной $startDate печатает дату для каждого дня календа ря. Поэтому любая итерация цикла увеличивает это значение.

  31. Создайте условную конструкцию for, которая будет определять, когда пе чатать строку $StartDate.
  32. if (($StartDate <= 0) | | ($StartDate > $LastDay)) {
    print ("<TD BGCOLOR=GREEN>&nbsp</TD>");
    } el'seif (($StartDate >= 1) && ($StartDate <= $LastDay)) {
    print ("<TD ALIGN=CENTER>$StartDate</TD>");
    }

    Если значение переменной $StartDate меньше нуля (другими словами, ме сяц еще не начался) или больше количества дней в месяце ($LastDate), на эк ране монитора будет отображена пустая зеленая область. В том случае если значение переменной $StartDate больше нуля, но меньше количества дней в месяце ($LastDate), будет напечатана дата.

  33. Закройте второй цикл, строку таблицы и первый цикл.
  34. }
    print ("</TR>\n");
    }
  35. Закончите таблицу.
  36. print ("</TABLE>\n");
  37. А теперь сделаем простую HTMLформу, которая передает страницу об ратно в себя.
  38. print ("<FORM ACTION=\"calendar.php\" METHOD=GET>\n");
  39. Создайте два ниспадающих меню: одно для месяца, другое для года.
  40. 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, новые значения будут использоваться вместо значений по умолчанию.

  41. Создайте кнопку Submit и закройте форму.
  42. print •("< INPUT TYPE=SUBMIT NAME=SUBMIT VALUE=\"Submiti\">\n");
    print ("</FORM>\n");
  43. Включите файл нижнего колонтитула и закройте тэг РНР.
  44. require ("footer.php");
    ?>
  45. Сохраните сценарий как calendar.php (листинг 13.5), загрузите его на сер вер и протестируйте в браузере (рис. 13.6 и 13.7).


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