Форматирование дат

Многие не знают, что в MODX Revolution можно очень просто форматировать даты и выводить их на русском языке.

Выводим день, месяц прописью и год.
[[+publishedon:strtotime:date=`%d %b %Y`]]
//30 Apr 2012

Для появления русского языка в начале шаблона нужно вызвать сниппет setLocale:
<?php
setlocale(LC_ALL, "ru_RU.UTF-8");
Есть еще вариант указать эту же локаль в системных параметрах, но бывают рэндомные искажения дат в админке потом. Лично у меня — нормально работает.

Проверяем:
[[+publishedon:strtotime:date=`%d %b %Yг.`]]
//30 Aпр 2012г.
Кстати, все функции использующие локали начнут понимать по-русски. Если вам нужно установить локаль только для функций времени, то используйте не LC_ALL, а LC_TIME. Подробнее о локалях.

Установка локали может не работать на криво настроенных хостингах, где просто отсутствует русская локаль — тогда месяц так и будет выводиться на английском. Все равно у вас остается возможность сделать вот так:

[[+publishedon:strtotime:date=`%d.%m.%Yг.`]]
//30.04.2012г.

Почитать про функцию форматирования даты strftime можно тут.

Если очень нужно вывести месяц на русском, но хостинг — вредина, то используйте вот этот сниппет dateRU.

<?php
$month_arr = array('01' => 'Янв',
                   '02' => 'Фев',
                   '03' => 'Мар',
                   '04' => 'Апр',
                   '05' => 'Мая',
                   '06' => 'Июн',
                   '07' => 'Июл',
                   '08' => 'Авг',
                   '09' => 'Сен',
                   '10' => 'Окт',
                   '11' => 'Ноя',
                   '12' => 'Дек'
                  );
  
$time = strtotime($input);
$month = strftime('%m', $time);
$day = strftime('%d', $time);
$year = strftime('%Y', $time);
    
return "$day $month_arr[$month] $year";

Вызывать вот так:
[[+publishedon:dateRU]]г.
//30 Апр 2012г.

Следующая заметка
Простейшая настройка мультиязычности
Наверх, в раздел
Тонкости и трюки


Комментарии ()

  1. Иван Брежнев 01 июля 2012, 23:00 # 0
    Что-то не хочет ваш сниппет работать
    1. Василий Наумкин 02 июля 2012, 01:52 # 0
      Спасибо, return "$day $month_arr[$month] $year" где то потерялся =)
      1. Иван Брежнев 02 июля 2012, 04:01 # 0
        Ага)
    2. Иван Брежнев 01 июля 2012, 23:27 # 0
      Вот рабочий
      <?php
      $month_arr = array('01' => 'Янвваря',
      '02' => 'Февраля',
      '03' => 'Марта',
      '04' => 'Апреля',
      '05' => 'Мая',
      '06' => 'Июня',
      '07' => 'Июля',
      '08' => 'Августа',
      '09' => 'Сентября',
      '10' => 'Октября',
      '11' => 'Ноября',
      '12' => 'Декабря'
      );

      $d = $input;
      $month = strftime("%m",$d);
      $year = strftime("%Y",$d);
      $day = strftime("%e",$d);
      $month = $month_arr[$month];

      return $day.' '.$month.' '.$year.' г.';
      1. Павлов Сергей 25 марта 2013, 11:49 # 0
        Ваш код не рабочий.
        Вот так должно быть

        Снипет: dateRU

        Вызов снипета: [[+publishedon:strtotime:dateRU]]

        Код снипета:

        <?php
        $month_arr = array('01' => 'Янв', 
        '02' => 'Фев',
        '03' => 'Мар',
        '04' => 'Апр',
        '05' => 'Май',
        '06' => 'Июн',
        '07' => 'Июл',
        '08' => 'Авг',
        '09' => 'Сен',
        '10' => 'Окт',
        '11' => 'Ноя',
        '12' => 'Дек'
        );
        
        $d = $input; 
        $month = strftime("%m",$d); 
        $year = strftime("%Y",$d); 
        $day = strftime("%d",$d); 
        $month = $month_arr[$month]; 
        
        return $day.' '.$month.' '.$year;
      2. Ga Serge 02 августа 2012, 17:23 # 0
        вообше то это делается через системные настройки и меняется ключ locale ^))
        1. Василий Наумкин 02 августа 2012, 17:53 # 0
          Да. Тока я раньше об этом не знал =)

          И на некоторых хостингах, видел глюки кодировки у дат в админке, при установке русской локали.
          1. Иван Брежнев 02 августа 2012, 18:46 # 0
            ага, такой косяк у меня был когда я в админке поставил русскую кодировку. Потом поставил обратно

            Была проблема с ценами, т.е. php понимает точку в качестве разделителя дробной части

            А где нужно в сниппете на русскую локаль не проблема поменять
        2. Юрий Волощук 08 августа 2012, 13:01 # 0
          да блин не работает, get Resource упрямо возвращает дату в кодировке win-1251? а сайт-то в utf…
          1. Андрей Розум 08 августа 2012, 15:02 # 0
            А этот utf-сайт на денвере, оупенсервере или т.п.?

            Если да, то наиболее очевидное решение — использовать формат %d-%m-%Y
            1. Dmitriy Badanin 20 ноября 2012, 22:31 # 0
              У меня тоже самое. Вам удалось найти решение?
            2. СикретНаме 28 февраля 2013, 04:01 # 0
              Нашёл вот такое решение:
              1. В файле index.php в корне modx(!) пишем: setlocale(LC_TIME, «ru_RU.UTF8»);
              2. В настройках системы, в словарь и язык находим «locale» и пишем: ru_RU.UTF8
              Профит.

              П.С.
              Полагаю, если это объединить с описанным Василием, то всегда, везде и во всех позах LANG у дат будет RU. А вот не будет ли избыточности, вопрос отдельный, хотя и не критичный, думаю.
              1. Bond Nataly 02 марта 2013, 20:12 # 0
                а не подскажете, как на хостинге(VPS) настроить локаль?
                1. Виталий Соломин 05 марта 2013, 11:46 # 0
                  У меня после установки свойства locale в LC_TIME,«ru_RU.UTF-8»
                  выводится следующее

                  04 ���� 2013
                  1. СикретНаме 23 июня 2013, 07:57 # 0
                    Во, блин, сюжет… В трёх местах нормально всё, в четвёртом 01 Янв 1970 выводит — ГЫ?! :0)
                    Как лечить и откуда ноги растут?
                    1. Андрей Кузьминых 17 июля 2013, 14:49 # 0
                      А без фильтра ту же дату как выводит? Такое ощущение, что она просто пустая, возможно с кэшированием глюки.
                      1. Сергей 16 сентября 2013, 23:48 # 0
                        [[+publishedon]]
                        замени на [[*publishedon]]
                      2. Чикин Артур 14 декабря 2013, 20:23 # 0
                        А в админке разве нельзя установить ЛОКАЛЬ?

                        Пункт локаль.
                        1. Василий Наумкин 14 декабря 2013, 21:10 # 0
                          А заметку прочитать?
                          Есть еще вариант указать эту же локаль в системных параметрах, но бывают рэндомные искажения дат в админке потом. Лично у меня — нормально работает.
                        2. Антон Матвеев 23 января 2014, 16:36 # 0
                          делал при помощи pdoResources вывод новостей и столкнулся с таким…

                          на той странице где несколько превью новостей —
                          [[!pdoResources? &tpl=`news-tpl`]]
                          шаблон news-tpl:
                          <div class="article">
                          	<div class="date">[[+publishedon]]</div>
                          	<div class="intro">
                          	    <h2><a href="[[~[[+id]]]]">[[+pagetitle]]</a></h2>
                              	<p>[[+introtext]]</p>
                          	</div>
                          </div>
                          Все выводится верно, кроме — publishedon. Тут появляются непонятные цифри или «0», а если применить форматирование даты то вообще пусто. Долго пытался понять, что же и почему оно не выводится… ведь раньше уже так делал

                          Установсил getResources заменил вызов и все стало как нужно

                          Видимо что то не так реализованно, или я что то не дописал?
                          1. Василий Наумкин 23 января 2014, 17:09 # 0
                            [[+publishedon:date=`%d.%m.%Yг.`]]
                            1. Антон Матвеев 23 января 2014, 17:15 # 0
                              Спасибо, помогло. А почему фильтр :strtotime уже не нужно писать? насчет этого ни где не встречал информации
                              1. Василий Наумкин 23 января 2014, 17:23 # 0
                                Потому, что данные в БД и так хранятся в timestamp, а pdoTools работает именно с ней, без преобразований.

                                P.S. Старайся нажимать на ссылку «Ответить», если ты отвечаешь на комментарий.
                                1. Aleksey Yakovlev 17 февраля 2014, 16:52 # 0
                                  и все же что-то не так я делаю. перехожу с getresources на pdo. вместо даты из TV EventDate выдает «1 января 1970 года». в вызове TV включено: "… &includeTVs=`pageImg, EventDate, EventPlace` &sortby=`EventDate` ...". В шаблоне регулируется формат даты TV [[+tv.EventDate:date=`%e %B %Y`]]. Если форматирование в шаблоне убрать — выводит указанную в Tv правильную дату, но слишком подробно. В вызов добавлял и processTVs=`1` и prepareTVs=`1`, но ничего не меняется. В крайнем случае можно наверное отформатировать вывод TV в настройках самого TV, но хотелось бы оставить себе пространство для маневра и брать его по умолчанию. Где ошибка?
                                  1. Василий Наумкин 17 февраля 2014, 16:58 # 0
                                    Ошибка в том, что для ТВ параметров обычно как раз нужен strtotime, а processTVs должно быть отключено, иначе ТВ отформатируется согласно своих настроек.

                                    Если в БД «245689123647» — то strtotime не нужно использовать. В таком виде хранятся даты у ресурсов сайта.
                                    Если в БД «2014-10-12 12:15» — то strtotime нужен, чтобы привести дату к секундам и её можно было отформатировать.
                                    [[+publishedon:date=`%e %B %Y`]]
                                    [[+tv.date:strtotime:date=`%e %B %Y`]]
                                    Понятно?
                                    1. Aleksey Yakovlev 17 февраля 2014, 17:06 # 0
                                      супер, спасибо!
                          2. bonzaznob 07 июня 2014, 20:24 # 0
                            Может кому то пригодится.
                            Для мультиязычности (babel) можно использовать конструкцию: (не забываем в настройки контекста добавить поля locale — т.е. значения для русскоязычной версии к примеру 'ru_RU.UTF-8' для en 'en_US.UTF-8');
                            Сниппет setLocale:
                            <?php
                            $locale = $modx->getOption('locale',null,'ru_RU.UTF-8');
                            setlocale(LC_ALL, $locale);
                            1. Алексей 07 июня 2014, 21:34 # 0
                              Интересно, как узнать, установлена ли у сервера русская локаль?
                              к примеру вот тут:
                              minishop2.com/manager/?a=81
                              на английском названия дат — у меня также. Хотелось бы по-русски но не могу никак докопаться в чем же все-таки дело.
                              Добавление новых комментариев отключено.