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г.»

Полный код функции:
// php 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")."г.";

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

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

Данная функция предполагает обработку не только даты, но и может быть модифицирована для любых преобразований цифра -> слово.

Если необходимо работать только с датой, то эту функцию можно оставить в покое, :) и воспользоваться старым провереным способом — setlocale();
setlocale (LC_TIME, "russian"); print (strftime("%B.\n"));

Возможные значения LC_TIME зависят от операционной системы.
Добавлено: 15 Августа 2013 01:06:50 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...