Функции работы с датами и временем
Формирование календаря на месяц
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). Основная идея состоит в том, что необходимо вначале вычислить «рамку», которая может начинаться
и в предыдущем месяце, а затем сформировать «коробочку», в которой, словно «пятнашки», разложены дни месяца.
Хитрость заключается в том, что функция 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>" ;
?>
|