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


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

13.1.11. Форматирование локальной даты и времени: strftime

string strftime (string format [, int timestamp])

Функция возвращает строку, отформатированную в соответствии с заданным форматом для времени, определенного аргументом timestamp, или для текущего времени, если этот аргумент не указан. При этом названия месяцев и дней недели извлекаются из локали, выбранной с помощью функции setlocale() (см. раздел 11.3.2).

Строка форматирования format может содержать следующие спецификаторы:
Сокращенное названия дня недели
Полное название дня недели
%b
Сокращенное название месяца
Полное название месяца
Предпочтительное для текущей локали представление даты и времени
Номер века (год, деленный на 100)
%d
День месяца как десятичное число (от 0 до 31)
%D
Тоже, чтои%т/%с!/%у
День месяца как десятичное число, одиночные цифры дополняются ведущим пробелом (то есть диапазон от 1 до 31)
%h
Тоже, что и %b
Номер часа в 24-часовом формате от 00 до 23
%1
Номер часа в 12-часовом формате от 01 до 12
%j
Hомер дня в году как десятичное число (от 001 до 366)
Номер месяца как десятичное число от 01 до 12
Минуты как десятичное число
%n
Символ новой строки
Либо «am», либо «рт» (в зависимости от текущего времени), либо строки, определенные в текущей локали
%r
Время с использованием a.m./p.m.-нотации
%R
Время в 24-часовом формате
%S
Секунды как десятичное число
%t
Символ табуляции
Текущее время; эквивалентно %Н: %М: %S
%u
День недели как десятичное число от 1 до 7, где 1 соответствует понедельнику (!!!)
%U
Номер недели в году как десятичное число. Отсчет начинается с первого воскресенья года
%V
Номер недели в году в соответствии с ISO 8601:1988. В отличие от предыдущего спецификатора первой считается неделя, которая имеет в текущем году по меньшей мере 4 дня, а первым днем недели считается понедельник
%W
Номер недели в году начиная с первого понедельника в году
%w
Номер дня недели. Воскресенье имеет код, равный О
Предпочтительный формат даты для текущей локали без использования времени
Предпочтительный формат представления времени для текущей локали без даты
Год как десятичное число без указания века (последние две цифры)
%Y
Год как десятичное число с указанием века
%Z
Временная зона или ее название, или аббревиатура
%%
Собственно символ «%»

Вот пример использования этой функции, который, однако, будет работоспособен только при наличии в вашей системе всех перечисленных локалей:

setlocale ("LC_TIME", "С");
print (strftime ("%A in Finnish is "));
setlocale ("LC_TIME", "fi_FI");
print (strftime ("%A, in French "));
setlocale ("LC_TIME", "fr_CA");
print (strftime ("%A and in German "));
setlocale ("LC_TIME", "de_DE");
print (strftime ("%A.\n"));
А русскому человеку гораздо ближе и, что главное, полезнее, использование нашей полной локали:
// Наш подход, с учетом кириллицы
setlocale ('LC_ALL','ru_RU.KOI8-R');
echo "Текущее время: ";
echo strftime("%d %B %Y, %H:%M:%S %Z, %A");
См. также описание функции date в ОС UNIX (man date).

13.1.12. Текущее время: time

int time ()

Возвращает текущее время, представляющее собой количество секунд, прошед- ших с начала эпохи UNIX (1 января 1970 года).

См. также описание функции date () (раздел 13.1.2).

13.1.13. Приведение к внутреннему формату: strtotime

1nt strtotime (string time [, int now])

Как утверждают разработчики PHP, эта функция позволяет разобрать практически любое текстовое представление (на английском языке) даты и времени во внутренний формат UNIX.

Вот несколько вариантов, с которыми в состоянии справиться эта функция:
echo strtotime ("now") . "\n";
echo strtotime ("10 September 2000") . "\n";
echo strtotime ("+1 day") . "\n";
echo strtotime ("+1 week") . "\n";
echo strtotime ("+1 week 2 days 4 hours 2 seconds") . "\n";

13.2. Формирование календаря на месяц

Теперь давайте взглянем на практический пример использования функций работы с датой и временем. В этом разделе приведен исходный текст программы построения календаря на любой заданный месяц (листинг 13.2). Основная идея состоит в том, что необходимо вначале вычислить «рамку», которая может начинаться и в предыдущем месяце, а затем сформировать «коробочку», в которой, словно «пятнашки», разложены дни месяца.

Хитрость заключается в том, что функция date() начинает отсчет недели с воскресенья, а мы традиционно считаем, что неделя начинается с понедельника.

Листинг 13.2. Составляем календарь на любой месяц <?php
#
# /examples/php/partS/calendar.php
#
function makecal($stmonth, $styear) {
###################################
## Определяем переменные
##

$face     ="Helvetica";      ## шрифт
$size     =" 3";     ## размер шрифта
$height     = "32";     ## высота ячейки
$width     = "32";     ## ширина ячейки
$todaycolor     = "#CC0000";      ## цвет для текущей даты
$inmonthface     ="#000000";     ## цвет дней текущего месяца
$outmonthface     ="#666666";     ## цвет дней прочих месяцев
$inbgcolor     = "#FFFFCC";      ## фон для дней текущего месяца
$outbgcolor     = "#FFCCFF" ;      ## фон для дней прочих месяцев

###################################
## Расчет начальных и конечных границ
## отображаемого поля

$stdate = mktime(0,0,0,$stmonth,l,$styear);
$startdate = $currdate =
       mktime(0,0,0,$stmonth,
       2 - date("w", mktime(0,0,0,$stmonth,1,$styear)) ,
                    $styear) ;
$enddate = mktime(0,0,0,date("m",$stdate) + 1,
       8 - date("w", mktime(0,0,0,$stmonth + 1,0 , $styear)),
                  $styear) ;

echo "<table border=l cellpadding=l cellspacing=0>\n";
echo "<tr>\n<th colspan=7 height=\"$height\">";
echo "<font face=\"$face\" size=\"$size\">" .
       date("F",$stdate) . " " . date("Y", $stdate) .
          "</th>\n</tr>\n";
echo <<tr>\n<th width=\"$width\" height=\"$height\"";
echo "valign=\"middle\" align=\"center\"><font face=\"$face\"";
echo "size=\"$size\">Пн</font></th>\n";
echo "<th width=\"$width\" height=\"$height\"";
echo "valign=\"middle\" align=\"center\"><font face=\"$face\"";
echo "size= "\"$size\">Bт</th>\n";
echo "<th width=\"$width\" height=\"$height\"";
echo "valign=\"middle\" align=\"center\"><font ";
echo "face=\"$face\" size=\"$size\">Cp</th>\n";
echo "<th width=\"$width\" height=\"$height\" ";
echo "valign=\"middle\" align=\"center\"><font face=\"$face\"";
echo "size=\"$size\">Чт</th>\n";
echo "<th width=\"$width\" height=\"$height\" ";
echo "valign=\"middle\" align=\"center\><font face=\"$face\"";
echo "size=\"$size\">Пт</th>\n";
echo "<th width=\"$width\" height=\"$height\" ";
echo "valign=\"middle\" align=\"center\"><font face=\"$face\"";
echo "size=\"$size\">Cб</th>\n";
echo "<th width=\"$width\" height=\"$height\" ";
echo "valign=\"middle\" align=\"center\"><font face=\"$face\"";
echo "size=\"$size\">
                             <font color=\"red\">Bc
</th>\n</tr>\n"

$i=0;
while ($currdate < $enddate) {
echo "<tr>\n";
for ($c = 0; $c < 7; $c++) {
       if (date ("m" .$stdate) == date ("m" .$currdate)) {
          $bgcolor = $inbgcolor;
       } else {
          $bgcolor = $outbgcolor; 
       if (date("d".$currdate) == date("d")
          && date ("m" .$currdate) == date ("m")
          && date("Y",$currdate) == date("Y")) {
          $fcolor = $todaycolor;
       } elseif (date ("m" .$currdate) == date ("m", $stdate)
          && dateC'Y",$currdate) == date("Y", $stdate)) {
          $fcolor = $inmonthface;
       } else {
          $fcolor = $outmonthface;

       echo "<td align=\"center\" height=\"$height\" ".
                    "width=\"$width\" valign=\"middle\" ".
                    "bgcolor=\"$bgcolor\"><font face=\"$face\"
                    "size=\"$size\" color=\"$fcolor\">";
       echo date ("j", Scurrdate);
       echo "</font></td>\n";
       $ i ++;<br>        $currdate = mktime(0,0,0 ,date ("m", $startdate).
          date ("d",$startdate) + $i ,date ("Y" .$startdate));

     echo "</tr>\n";
}
echo "</table>";
}
###################################
## Вариант использования описанных функций
##

echo "<html><head></head><body bgcolor=\"#ffffff\">\n\n"
echo "<form action=calendar.php method=post>\n";
echo "<select name=stmonth>\n";
echo "<option vаluе=1>Январь\n";
echo "<option vаluе=2>Февраль\n";
echo "<option value=3>Mapт\n";
echo "<option value=4>Aпpeль\n";
echo "<option value=5>Maй\n";
echo "<option vаluе=6>Июнь\n";
echo "<option vаluе=7>Июль\n";
echo "<option value=8>Aвгуcт\n";
echo "<option vаluе=9>Сентябрь\n";
echo "<option vаluе=10>0ктябрь\n";
echo "<option уаluе=11>Ноябрь\n";
echo "<option vаluе=12>Декабрь\n";
echo "</select>\n";
echo "<select name=styear>\n";
echo "<option>2001\n"
echo "<option>2002\n"
echo "<option>2003\n"
echo "<option>2004\n"
echo "</select>\n" ;
echo "<input type=submit vаluе=\"Вывести календарь\">\n
                                                                                </form>\n\n"
echo "<BR>\n\n";

if ($stmonth && $styear && empty($source)) {
       echo makecal($stmonth, Sstyear) ;
} elseif (empty($source)) {
       echo makecal(date("m") , date ("Y")) ;
} else {
       echo "<code><font s1ze=l>\n";
       show_source(" calendar .php") ;
       echo "</font></code>\n" ;
       }
echo "</body>\n</html>" ;
?>
назад
далее

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