Один из наиболее простых приемов. Про него почему-то забывают, указывая дату на страницах в совершенно неудобоваримом виде, типа 10/10/00 или 2001-05-01. Хорошо если в таких датах присутствует число более 12-и — становится понятно, где указан день, а где месяц. Но от этого легче не становится.
Сначала узнаем номер месяца:
$curDateD = date("d"); $curDateM = date("m"); # номер месяца $curDateY = date("Y");
Номер месяца узнали, теперь нужна функция преобразования цифрового значения в буквенный. Назовем функцию monthFromNum. В качестве параметров вызова укажем:
Номер месяца.
В каком описании должно быть название месяца, то есть «январь» или «янв».
Язык, на котором должно быть сообщено название месяца, то есть либо английский "january", либо русский «январь». В принципе, можно на любом языке. Пока остановимся на русском.
function monthFromNum($input, $type="S", $lang="R")
{
if ($lang == "R")
{
if ($type == "S")
{
$Months = array(
"01"=>"янв",
"02"=>"фев",
"03"=>"мар",
"04"=>"апр",
"05"=>"май",
"06"=>"июн",
"07"=>"июл",
"08"=>"авг",
"09"=>"сен",
"10"=>"окт",
"11"=>"ноя",
"12"=>"дек");
}
elseif ($type == "L")
{
$Months = array(
"01"=>"январь",
"02"=>"февраль",
"03"=>"март",
"04"=>"апрель",
"05"=>"май",
"06"=>"июнь",
"07"=>"июль",
"08"=>"август",
"09"=>"сентябрь",
"10"=>"октябрь",
"11"=>"ноябрь",
"12"=>"декабрь");
}
}
for (reset($Months); list($k,$v) = each($Months);)
{
if ($input == $k)
{
return "$v";
}
} // ---[покусано]---
Попытаемся учесть возможные значения:
$input = от 1 до 12 (номер месяца)
$type = "S", Short (короткое написание, «янв»)
$type = "L", Long (полное написание, «январь»)
$Lang = "R", Russian (русский)
$Lang = "E", English (английский)
Вызов функции:
print "<b>$curDateD ".monthFromNum($curDateM;,"L")." $curDateY</b>";
После этого print напишет: 11 март 2001
Но такой вид, кстати, тоже не катит. Хочется вместо «11 март 2001» видеть «11 марта 2001г.»
Полный код функции:
// php3 function
monthFromNum($input, $type="S", $lang="ru")
{
switch($lang)
{
case "ru":
if ($type == "S")
{
$Months = array(
"01"=>"янв",
"02"=>"фев",
"03"=>"мар",
"04"=>"апр",
"05"=>"май",
"06"=>"июн",
"07"=>"июл",
"08"=>"авг",
"09"=>"сен",
"10"=>"окт",
"11"=>"ноя",
"12"=>"дек");
}
elseif ($type == "L")
{
$Months = array(
"01"=>"января",
"02"=>"февраля",
"03"=>"марта",
"04"=>"апреля",
"05"=>"мая",
"06"=>"июня",
"07"=>"июля",
"08"=>"августа",
"09"=>"сентября",
"10"=>"октября",
"11"=>"ноября",
"12"=>"декабря");
}
break;
default:
if ($type == "S")
{
$Months = array(
"01"=>"jan",
"02"=>"feb",
"03"=>"mar",
"04"=>"apr",
"05"=>"may",
"06"=>"jun",
"07"=>"jul",
"08"=>"aug",
"09"=>"sep",
"10"=>"oct",
"11"=>"nov",
"12"=>"dec");
}
elseif ($type == "L")
{
$Months = array(
"01"=>"january",
"02"=>"february",
"03"=>"march",
"04"=>"april",
"05"=>"may",
"06"=>"june",
"07"=>"july",
"08"=>"august",
"09"=>"september",
"10"=>"october",
"11"=>"november",
"12"=>"december");
}
break;
}
if(isset($Months))
{
for (reset($Months); list($k,$v) = each($Months);)
{
if ($input == $k)
{
return $v;
}
}
}
return $input;
}
# end of function
Более продвинутый способ вызова функции включает возможность указания символа в качестве разделителя:
$delim = " ";
print date("d").$delim.monthFromNum(date("m"),"L").$delim.date("Y")."г.";
Предлагаю именно — символ неразрывного пробела, иначе текст даты может некрасиво разъехаться при определенных обстоятельствах. Или нужно применять <nobr>11 марта 2001г.</nobr>
Короткие замечания:
Данная функция предполагает обработку не только даты, но и может быть модифицирована для любых преобразований цифра -> слово.
Если необходимо работать только с датой, то эту функцию можно оставить в покое, :) и воспользоваться старым провереным способом — setlocale();
setlocale (LC_TIME, "russian"); print (strftime("%B.\n"));
Возможные значения LC_TIME зависят от операционной системы.