MODX. Даты и их форматирование в MODX
Отредактировано: 24 Февраля 2025
В стандартных ресурсах 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") | --- |
| %% | Символ процента ("%") | --- |
Для вывода текущей даты без использования сторонних сниппетов можно использовать этот код:
// только год
[[!+nowdate:default=`now`:strtotime:date=`%Y`]]
// дата в формате: 01 января 2025
[[!+nowdate:default=`now`:strtotime:date=`%d %B %Y`]]
Текущая дата при помощи fenom:
получение и вывод текущего timestamp
{set $time = time()}
{$time}
// форматировать можно при помощи модификаторов date или date_format
{$time|date:"Y.m.d"} // гггг.мм.дд
{$time|date_format:"%Y/%m/%d %H:%M:%S"} // гггг/мм/дд чч:мм:сс
// пример арифметических функций с датами
{$time|date_format:"-1 day"}
// либо при помощи форматирования даты через date
// год
{'' | date : 'Y'}
// дата полностью
{'2025-01-01 00:00' | date : 'd.m.Y'} // 01.01.2025
Арифметика с датами (можно использовать любые числа):
// дата завтра
{'+1 days' | date : 'Y-m-d'}
// дата вчера
{'-1 days' | date : 'Y-m-d'}
Если необходимо вывести месяц на русском полностью, можно поменять локаль в настройках контекста:
- Системные настройки (шестерёнка) → пункт контексты (contexts);
- Нажимаете на «редактировать» в нужном контексте;
- Добавляем новый пункт «locale» (или редактируем если уже есть) в значении указываем: ru_RU.UTF-8.
Если необходимо вывести месяц в формате не доступном на сервере, можно использовать подобный сниппет для преобразования, к примеру назовём 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";
Вызов сниппета:
[[*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 часа), и наоборот со знаком минус.