Дата по-человечески

php

Один из наиболее простых приемов. Про него почему-то забывают, указывая дату на страницах в совершенно неудобоваримом виде, типа 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 = "&nbsp;";
print date("d").$delim.monthFromNum(date("m"),"L").$delim.date("Y")."г.";

Предлагаю именно &nbsp; — символ неразрывного пробела, иначе текст даты может некрасиво разъехаться при определенных обстоятельствах. Или нужно применять <nobr>11 марта 2001г.</nobr>

Короткие замечания:

  • Данная функция предполагает обработку не только даты, но и может быть модифицирована для любых преобразований цифра -> слово.
  • Если необходимо работать только с датой, то эту функцию можно оставить в покое, 🙂 и воспользоваться старым провереным способом — setlocale();

setlocale (LC_TIME, "russian");
print (strftime("%B.\n"));

Возможные значения LC_TIME зависят от операционной системы.

Автор: Дмитрий Шильников

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *