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 зависят от операционной системы.
Теги:
Дата
Добавлено: 17 Мая 2018 19:16:16 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...