webew
Войти » Регистрация
 
PHP
MySQL/MariaDB

русскоязычные даты в MySQL и PHP

8 января 2012, 20:56
Автор: 1234ru
При работе с сервером MySQL русскоязычных дат можно добиться и встроенными в него средствами, хотя об этом мало кто знает.

В MySQL имеется настройка, позволяющая выбирать язык даты - lc_time_names, вот какие чудеса можно делать с её помощью:

SET @@lc_time_names = ru_RU;
SELECT  DATE_FORMAT(NOW(), '%e %M (%b), %W (%a)')

+-------------------------------------------+
| DATE_FORMAT(NOW(), '%e %M (%b), %W (%a)') |
+-------------------------------------------+
| 8 Января (Янв), Воскресенье (Вск)         |
+-------------------------------------------+
Добиться, однако, от MySQL названия месяца в именительном падеже нельзя (функция MONTHNAME() возвращает имена месяцев в родительном падеже - так, как будто они являются частью даты).


В PHP ситуация обратная: функция strtime() возвращает месяц в именительном падеже:

echo strftime('%d %B'); // 08 Январь

В связи с этим для PHP необходим код, корректирующий работу названиями месяца:

echo strftime_rus('%d %B2'); // 08 января
echo strftime_rus('%e %B2', '2012-01-05'); // 5 января

function strftime_rus($format, $date = FALSE) {
    // Работает точно так же, как и strftime(),
    // только в строке формата может принимать
    // дополнительный аргумент %B2, который будет заменен
    // на русское название месяца в родительном падеже.
   
    // В остальном правила для $format такие же, как и для strftime().
    // (в связи с этим рекомендуется настроить выполнение скрипта
    // с помощью setlocale: http://php.net/setlocale)
   
    // Второй аргумент можно передавать как в виде временной метки
    // так и в виде строки типа 2010-05-16 23:48:20
    // функция сама определит, в каком виде передана дата,
    // и проведет преобразование.
    // Если второй аргумент не указан,
    // функция будет работать с текущим временем.
   
    if (!$date)
        $timestamp = time();
   
    elseif (!is_numeric($date))
        $timestamp = strtotime($date);
   
    else
        $timestamp = $date;
   
    if (strpos($format, '%B2') === FALSE)
        return strftime($format, $timestamp);
   
    $month_number = date('n', $timestamp);
   
    switch ($month_number) {
        case 1: $rus = 'января'; break;
        case 2: $rus = 'февраля'; break;
        case 3: $rus = 'марта'; break;
        case 4: $rus = 'апреля'; break;
        case 5: $rus = 'мая'; break;
        case 6: $rus = 'июня'; break;
        case 7: $rus = 'июля'; break;
        case 8: $rus = 'августа'; break;
        case 9: $rus = 'сентября'; break;
        case 10: $rus = 'октября'; break;
        case 11: $rus = 'ноября'; break;
        case 12: $rus = 'декабря'; break;
    }
   
    $rusformat = str_replace('%B2', $rus, $format);
   
    return strftime($rusformat, $timestamp);
}

Добавить комментарий
© 2008—2024 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: