MODX. Даты и их форматирование в MODX

В стандартных ресурсах MODX предусмотрены следующие плейсхолдеры с датами:

  • createdon — дата создания;
  • deletedon — дата удаления;
  • editedon — дата последнего редактирования;
  • publishedon — дата когда ресурс был опубликован;
  • pub_date — дата когда ресурс должен появиться в публикации;
  • unpub_date — дата снятия с публикации.

Выведем дату редактирования текущего ресурса в формате день, месяц прописью, год:

[[*editedon:date=`%d %b %Y`]] 

Если возникла проблема с выводом русского языка, в начале шаблона, или в системных параметрах попробуйте добавить локаль (подробнее о локалях):

<?php
setlocale(LC_TIME, "ru_RU.UTF8");

 Если возникла проблема с правильностью отображения даты, попробуйте преобразовать с помощью модификатора :strtotime

[[*editedon:strtotime:date=`%d %b %Y`]] 

Формат вывода даты задается с использованием функции strftime

strftime — форматирует текущую дату / время с учетом текущих настроек локали.

Параметры функции strftime

format Описание Пример возвращаемых значений
День --- ---
%a Сокращенное название дня недели От Sun до Sat
%A Полное название дня недели От Sunday до Saturday
%d Двухзначное представление дня месяца (с ведущими нулями) От 01 до 31
%e День месяца, с ведущим пробелом, если он состоит из одной цифры. На Windows реализован не так, как описано. Подробнее смотрите ниже. От 1 до 31
%j Порядковый номер в году, 3 цифры с ведущими нулями От 001 до 366
%u Порядковый номер дня недели согласно стандарту ISO-8601 От 1 (понедельник) до 7(воскресенье)
%w Порядковый номер дня недели От 0 (воскресенье) до 6(суббота)
Неделя --- ---
%U Порядковый номер недели в указанном году, начиная с первого воскресенья в качестве первой недели 13 (для полной 13-й недели года)
%V Порядковый номер недели в указанном году в соответствии со стандартом ISO-8601:1988, счет начинается с той недели, которая содержит минимум 4 дня, неделя начинается с понедельника От 01 до 53 (где 53 указывает на перекрывающуюся неделю)
%W Порядковый номер недели в указанном году, начиная с первого понедельника в качестве первой недели 46 (для 46-й недели года, начинающейся с понедельника)
Месяц --- ---
%b Аббревиатура названия месяца, в соответствии с настройками локали От Jan до Dec
%B Полное название месяца, в соответствии с настройками локали От January до December
%h Аббревиатура названия месяца, в соответствии с настройками локали (псевдоним %b) От Jan до Dec
%m Двухзначный порядковый номер месяца От 01 (январь) до 12(декабрь)
Год --- ---
%C Двухзначный порядковый номер столетия (год, деленный на 100, усеченный до целого) 19 для 20-го века
%g Двухзначный номер года в соответствии со стандартом ISO-8601:1988 (см. %V) Пример: 09 для недели 6 января 2009
%G Полная четырехзначная версия %g Пример: 2009 для недели 3 января 2009
%y Двухзначный порядковый номер года Пример: 09 для 2009, 79для 1979
%Y Четырехзначный номер года Пример: 2038
Время --- ---
%H Двухзначный номер часа в 24-часовом формате От 00 до 23
%k Часы в 24-часовом формате, с пробелом перед одиночной цифрой От 0 до 23
%I Двухзначный номер часа в 12-часовом формате От 01 до 12
%l (строчная 'L') Час в 12-часовом формате, с пробелом перед одиночной цифрой От 1 до 12
%M Двухзначный номер минуты От 00 до 59
%p 'AM' или 'PM' в верхнем регистре, в зависимости от указанного времени Пример: AM для 00:31, PMдля 22:23
%P 'am' или 'pm' в зависимости от указанного времени Пример: am для 00:31, pmдля 22:23
%r То же что и "%I:%M:%S %p" Пример: 09:34:17 PM для 21:34:17
%R То же что и "%H:%M" Пример: 00:35 для 12:35 AM, 16:44 для 4:44 PM
%S Двухзначный номер секунды От 00 до 59
%T То же что и "%H:%M:%S" Пример: 21:34:17 для 09:34:17 PM
%X Предпочитаемое отображение времени в зависимости от локали, без даты Пример: 03:59:16 или 15:59:16
%z Смещение временной зоны относительно UTC. Не реализовано в Windows, подробности см. ниже. Пример: -0500 для US Eastern Time
%Z Аббревиатура временной зоны. Не реализовано в Windows, подробности см. ниже. Пример: EST для Eastern Time
Метки даты и времени --- ---
%c Предпочитаемое отображение даты и времени, в зависимости от текущей локали Пример: Tue Feb 5 00:45:10 2009 для 5 февраля 2009 00:45:10
%D То же что и "%m/%d/%y" Пример: 02/05/09 для 5 февраля 2009
%F То же что и "%Y-%m-%d" (обычно используется в метках времени баз данных) Пример: 2009-02-05 для 5 февраля 2009
%s Метка времени Эпохи Unix (то же что и функция time()) Пример: 305815200 для 10 сентября 1979 08:40:00
%x Предпочитаемое отображение даты, без времени Пример: 02/05/09 для 5 февраля 2009
Различное --- ---
%n Символ перевода строки ("\n") ---
%t Символ табуляции ("\t") ---
%% Символ процента ("%") ---

Если необходимо вывести месяц на русском полностью, или в формате не доступном на сервере, можно использовать подобный сниппет для преобразования:

<?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";

 Вызов сниппета:

[[*editedon:dateRU]] 

 Условное выражение с использованием тегов MODX:

[[*publishedon:notempty=`
    [[*publishedon:date=`%D`:ge=`[[!*editedon:date=`%D`]]`:then=`
        Опубликовано: [[*publishedon:strtotime:dateRU]]`:else=`
        Отредактировано: [[*editedon:strtotime:dateRU]]`]]
`]]

Тоже самое но в сниппете:

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

$publishedon = dateRu($modx->resource->get('publishedon','%s'));
$editedon = dateRu($modx->resource->get('editedon', '%s'));

if ($publishedon) {
    $out = '';
    if ($publishedon == $editedon){
        $out = 'Опубликовано: '.$publishedon;
    }else{
        $out = 'Отредактировано: '.$editedon;
    }
    return $out;
}

Для установки даты через xPDO или для TV полей с типом data можно использовать следующие сущности:

  • today — будет установлена сегодняшняя дата.
  • now — текущая дата и время.
  • yesterday — вчера.
  • tomorrow — завтра.
  • + / - (любое число)h — почему-то в перепутанном порядке, +24h высчитывается как (сегодня - 24 часа), и наоборот со знаком минус.