MODX. Даты и их форматирование в MODX
Отредактировано: 15 Декабря 2019
В стандартных ресурсах 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 часа), и наоборот со знаком минус.
Здравствуйте!
Позвольте представиться, меня зовут Марина. Более 10 лет я занимаюсь обслуживанием сайтов и развитием интернет проектов. Если вы хотите избавиться от хлопот связанных с созданием и поддержкой сайта, тогда вы попали по адресу. При работе с сайтами я предоставляю качественные услуги, ориентируясь на ваши индивидуальные потребности. Для связи со мной воспользуйтесь формой обратной связи.