русскоязычные даты в 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)')
В PHP ситуация обратная: функция strtime() возвращает месяц в именительном падеже:
echo strftime('%d %B'); // 08 Январь
В связи с этим для PHP необходим код, корректирующий работу названиями месяца:
В 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() возвращает имена месяцев в родительном падеже - так, как будто они являются частью даты).| DATE_FORMAT(NOW(), '%e %M (%b), %W (%a)') |
+-------------------------------------------+
| 8 Января (Янв), Воскресенье (Вск) |
+-------------------------------------------+
В 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);
}
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);
}