Отображение дат и времени в Cotonti: полное руководство
В этой статье подробно рассматриваются все аспекты работы с датами и временем в Cotonti: базовые функции, локализация, работа с шаблонами, вывод дат в различных форматах.
Отображение дат и времени в Cotonti: полное руководство (актуализировано на 16.08.2026)
Введение
Cotonti хранит большинство дат и времени в формате Unix timestamp — целого числа, представляющего количество секунд, прошедших с полуночи 1 января 1970 года по UTC. Такой подход обеспечивает единообразие, удобство сравнения и корректную работу с часовыми поясами. Для отображения дат в удобочитаемом виде и обработки пользовательского ввода в системе предусмотрен набор функций и предопределённых форматов.
В этой статье подробно рассматриваются все аспекты работы с датами и временем в Cotonti: базовые функции, локализация, работа с шаблонами и экстраполями типа datetime. Актуальная информация основана на основе актуального исходного кода Cotonti (файлы system/extrafields.php, system/forms.php, system/functions.php, а также языковой файл lang/ru/main.ru.lang.php) и не содержит предположений.
Хранение дат и времени в Cotonti
Практически все поля, содержащие дату и время, в базе данных Cotonti хранятся как целые числа (int) — Unix timestamp в UTC. Это касается как стандартных полей (например, user_regdate, page_date), так и экстраполей типа datetime.
Пустое значение даты обычно соответствует 0. Это важно учитывать при выводе: при форматировании через стандартные функции 0 может быть преобразован в дату 1 января 1970 года, что часто нежелательно. Поэтому при работе с датами необходимо явно проверять значение перед выводом.
Использование UTC при хранении позволяет избежать проблем с часовыми поясами: каждый пользователь видит дату и время в своей локальной зоне.
Функция cot_date()
Сигнатура:
function cot_date($format, $timestamp = null, $usertimezone = true)Функция является обёрткой над PHP-функцией date() с дополнительной поддержкой локализации и учётом часового пояса текущего пользователя.
Параметры
$format— строка формата. Может быть ключом из массива$Ldt(например,'datetime_medium') или стандартным PHP-форматом ('Y-m-d H:i').$timestamp— Unix timestamp. Если не передан, используется текущее времяCot::$sys['now'].$usertimezone— флаг, определяющий, учитывать ли часовой пояс пользователя. По умолчаниюtrue.
Алгоритм работы
- Если
$timestampне задан, берётсяCot::$sys['now']. - Timestamp приводится к целому числу:
(int)$timestamp. - Если
$usertimezone === true, к timestamp прибавляется смещение часового пояса пользователя:$timestamp += Cot::$usr['timezone'] * 3600. Это переводит время из UTC в локальное время пользователя. - Если ключ
$formatсуществует в массиве$Ldt, используется соответствующая строка формата, иначе — сам$format. - Вызывается PHP-функция
date()с полученной строкой формата. - Для неанглийских языков выполняется замена английских названий дней недели и месяцев на локализованные значения из массива
$L. - Возвращается отформатированная строка.
Пример использования
$timestamp = 1755345090; // 16.08.2026 14:31:30 UTC
echo cot_date('datetime_medium', $timestamp);
// Результат для русского языка: "16.08.2026 14:31" (с учётом часового пояса пользователя)Если необходимо вывести дату без учёта часового пояса, передайте false третьим параметром:
echo cot_date('Y-m-d H:i', $timestamp, false); // всегда UTCПредопределённые форматы $Ldt
Массив $Ldt определён в языковых файлах Cotonti. В актуальной версии он находится в файле lang/ru/main.ru.lang.php (и аналогичных файлах для других языков). Он содержит именованные форматы, адаптированные под национальные особенности отображения дат. Использование ключей из $Ldt предпочтительнее, чем прямое указание PHP-формата, так как они автоматически учитывают локаль.
Актуальная таблица форматов для русского языка (примеры рассчитаны на дату 16 августа 2026 года, воскресенье, 14:31:30):
| Ключ | Формат (RU) | Пример вывода |
|---|---|---|
date_full | d.m.Y | 16.08.2026 |
date_medium | m.Y | 08.2026 |
date_short | d.m | 16.08 |
date_text | d F Y | 16 августа 2026 |
date_fulltext | l, d F Y | Воскресенье, 16 августа 2026 |
time_full | H:i:s | 14:31:30 |
time_medium | G:i | 14:31 |
time_short | i:s | 31:30 |
time_text | g:i A | 2:31 PM |
time_fulltext | g:i:s A | 2:31:30 PM |
datetime_full | d.m.Y H:i:s | 16.08.2026 14:31:30 |
datetime_medium | d.m.Y H:i | 16.08.2026 14:31 |
datetime_short | d.m H:i | 16.08 14:31 |
datetime_text | d F Y H:i | 16 августа 2026 14:31 |
datetime_fulltext | l, d F Y H:i | Воскресенье, 16 августа 2026 14:31 |
week_full | o-\WW | 2026-W34 |
week_medium | \WW | W34 |
week_short | \WW-N | W34-7 |
week_text | \WW, l | W34, Воскресенье |
week_fulltext | o-\WW, l | 2026-W34, Воскресенье |
Примечание: номер недели W34 вычислен по стандарту ISO-8601 для 16.08.2026. Если номер недели относится к предыдущему или следующему году, в форматах с o будет показан соответствующий год.
Эти форматы могут отличаться для других языков, поэтому всегда следует обращаться к соответствующему языковому файлу (например, lang/en/main.en.lang.php).
Глобальное переопределение форматов
Изменить формат вывода дат для всей системы можно, переопределив элементы массива $Ldt. Для этого достаточно в языковом файле темы или плагина добавить нужные строки, например:
$Ldt['datetime_medium'] = 'Y-m-d H:i'; // переопределяем на MySQL-стильПосле этого все вызовы cot_date('datetime_medium', ...) будут использовать новый формат. Рекомендуется не изменять системные файлы напрямую, а создавать переопределения в файлах темы (theme.en.lang.php, theme.ru.lang.php и т.п.), чтобы обновления ядра не затирали изменения.
Использование cot_date() в шаблонах
В XTemplate-шаблонах Cotonti поддерживаются обратные вызовы (callbacks). Синтаксис:
{TAG|функция('аргумент1', 'аргумент2', $this)}$this обозначает значение тега. Например, если {PAGE_ROW_DATE_STAMP} содержит Unix timestamp, то:
{PAGE_ROW_DATE_STAMP|cot_date('d-m-Y', $this)}вернёт дату в формате день-месяц-год (например, 16-08-2026).
Использование предопределённого формата
{PAGE_ROW_DATE_STAMP|cot_date('date_full', $this)}Учёт часового пояса
По умолчанию cot_date учитывает часовой пояс пользователя. Если нужно вывести время строго в UTC, передайте третий параметр false:
{PAGE_ROW_DATE_STAMP|cot_date('Y-m-d H:i', $this, false)}Однако в большинстве случаев требуется локальное время, поэтому параметр false используется редко.
Импорт дат: cot_import_date()
Сигнатура:
function cot_import_date($name, $usertimezone = true, $returnarray = false, $source = 'P')Функция предназначена для извлечения даты и времени из входящих данных (POST, GET, COOKIE) и преобразования их в Unix timestamp.
Параметры
$name— имя поля (без квадратных скобок, если это массив).$usertimezone— флаг учёта часового пояса. По умолчаниюtrue.$returnarray— еслиtrue, возвращает массив с компонентами (stamp,year,month,day,hour,minute).$source— источник данных:'P'(POST),'G'(GET),'C'(COOKIE).
Алгоритм работы
- Проверяет наличие кастомной функции
cot_import_date_custom()и хукаimport.date. - Пытается получить массив из источника с ключами
year,month,day,hour,minute. - Если массив пуст, пробует прочитать значение как обычную строку (например,
'2026-08-16 14:30'). - Если это строка, преобразует её в timestamp через
cot_date2stamp(). - Если получен массив:
- Проверяет, все ли компоненты равны
null(пустая дата) → возвращаетnull. - Если условие
($month && $day && $year) || ($day && $minute)истинно, собирает timestamp черезcot_mktime($hour, $minute, 0, $month, $day, $year). - В противном случае использует дополнительные поля
stringиformat, если они есть.
- Проверяет, все ли компоненты равны
- Если
$usertimezone === true, вычитает часовой пояс пользователя:$timestamp -= Cot::$usr['timezone'] * 3600. Это приводит время к UTC перед сохранением. - Возвращает timestamp (или массив, если
$returnarray = true).
Пример использования
$myDate = cot_import_date('rdate', true, false, 'P');
// $myDate — Unix timestamp в UTC или null, если дата не заданаФормирование формы даты: cot_selectbox_date()
Сигнатура:
function cot_selectbox_date($utime, $mode = 'long', $name = '', $max_year = 2030, $min_year = 2000, $usertimezone = true, $custom_rc = '')Функция генерирует набор выпадающих списков для выбора даты и времени.
Параметры
$utime— текущее значение (timestamp) или0для пустой даты.$mode— режим:'long'(год, месяц, день, час, минута) или'short'(только дата).$name— базовое имя поля (например,rxtra_x200_last_promotion).$max_year,$min_year— границы лет.$usertimezone— учитывать ли часовой пояс при отображении. По умолчаниюtrue.$custom_rc— имя ресурсного шаблона.
Поведение
- Если
$utime == 0, списки отображаются пустыми (или восстанавливаются из буфера). - Если определена функция
cot_selectbox_date_custom(), она используется вместо стандартной. - Хук
form.dateпозволяет полностью переопределить вывод. - Итоговые имена полей формируются как
$name.'[year]',$name.'[month]',$name.'[day]',$name.'[hour]',$name.'[minute]'.
Функция автоматически корректирует отображаемое время на часовой пояс пользователя, если $usertimezone = true и $utime > 0.
Пример на основе создания статьи:
'PAGEADD_FORM_DATE' => cot_selectbox_date(Cot::$sys['now'], 'long', 'rpagedate'),Вывод и показ в шаблоне
{PAGEADD_FORM_DATE}селектор формируем в ресурсных строках
$R['input_date'] = '{$day} {$month} {$year} {$hour}: {$minute}';После сохранения в базу записалось число вида: 1755345090
Открываем страницу, и видим текст, такого рода
Страница размещена: 16.08.2026 13:02выводится она в шаблоне тегом (шаблоны и темы котонти бесплатно в маркетплейсе)
<!-- IF {PAGE_CREATED} -->
{PAGE_CREATED}
<!-- ENDIF -->Как это происходит?
в логике обработки страницы статьи есть ВЫЗОВ функции
cot_generate_pagetags(
$pag,
'PAGE_',
0,
Cot::$usr['isadmin'],
Cot::$cfg['homebreadcrumb'],
'',
$pag['page_pageurl']
)которая лежит в самом файле функций
из неё подхватываем строку
'CREATED' => cot_date($date_format, $page_data['page_date']),где как видите, мы уже используем функцию
function cot_date($format, $timestamp = null, $usertimezone = true)где первым параметром указан формат даты, в переменной выше по коду выглядит вот так
$date_format = 'datetime_medium';а вторым параметром передаем наш $timestamp который равен $page_data['page_date'] и лежит в базе в таком виде 1755345090 что есть количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года
Это позволяет нам как угодно “играться с форматами”. даже здесь далеко не все примеры, но рекомендую посмотреть и почитать “Примеры: Вывод даты создания статьи в Cotonti: все способы”
Экстраполя типа datetime
Экстраполя с типом datetime полностью интегрированы в описанную выше систему. Они хранят значение в БД как int DEFAULT '0' и используют те же функции для построения формы, импорта и вывода.
Параметры поля
Поле field_params для datetime содержит строку min,max,format.
- min — минимальный год. Если значение ≤ 0, используется
2000. - max — максимальный год. Если значение ≤ 0, используется
2030. - format — формат вывода (ключ из
$Ldtили PHP-формат). Если пусто, при выводе возвращается сам timestamp.
Пример: "2000,2030,datetime_medium".
Построение формы
В функции cot_build_extrafields() (ветка case 'datetime'):
- Разбираются параметры
min,max,format. - Обрабатываются относительные даты: если значение начинается с
+или-, оно интерпретируется как смещение в секундах от текущего времени$sys['now']. Например,+86400— завтра. - Вызывается
cot_selectbox_date((int)$data, 'long', $name, (int)$max, (int)$min, true, $extrafield['field_html']).
В результате форма содержит пять выпадающих списков: год, месяц, день, час, минута.
Импорт и сохранение
При сохранении формы вызывается cot_import_extrafields() (ветка case 'datetime'):
- Вызывает
cot_import_date($inputname, true, false, $source). - Если результат
null, устанавливает$import = 0. - Если заданы
minилиmax(больше 0), проверяет год полученной даты и при необходимости корректирует его, сохраняя остальные компоненты. - Если поле обязательное и итоговое значение
0, генерирует ошибку.
Итоговое значение — Unix timestamp в UTC.
Вывод значения
Для вывода используется cot_build_extrafields_data(). Если в параметрах поля задан format, вызывается cot_date($format, $value). Иначе возвращается сам timestamp.
Часовые пояса
- При вводе время корректируется по часовому поясу пользователя, заполняющего форму (вычитается смещение), и сохраняется в UTC.
- При выводе время корректируется по часовому поясу пользователя, просматривающего страницу (прибавляется смещение), и отображается локально.
Вспомогательные функции
cot_mktime()
Создаёт Unix timestamp из компонентов даты. Если аргументы не переданы, используются текущие значения.
function cot_mktime($hour = false, $minute = false, $second = false, $month = false, $date = false, $year = false)cot_date2stamp()
Преобразует строку с датой в Unix timestamp.
- Если формат не указан или равен
'auto', используетсяstrtotime(). - Иначе используется
date_parse_from_format(). - Возвращает
nullдля пустых или нулевых дат (например,'0000-00-00').
cot_stamp2date()
Преобразует timestamp в строку формата Y-m-d (MySQL date).
Суффиксы _VALUE в контексте дат
При генерации тегов для экстраполей типа datetime обычно используются теги с суффиксами:
_VALUE— «сырое» значение из базы данных, то есть Unix timestamp (целое число) или0, если дата не указана. Используется для проверок и сравнений._TITLE— название поля.- Обычный тег (без суффикса) — отформатированное значение, если в параметрах поля задан формат. При пустой дате (
0) такой тег может вернуть строку вроде «1 января 1970», поэтому для проверки наличия даты следует использовать_VALUE.
Пример для datetime
<!-- IF {USERS_DETAILS_XTRA_X200_LAST_PROMOTION_VALUE} -->
<div class="contact-label">{USERS_DETAILS_XTRA_X200_LAST_PROMOTION_TITLE}</div>
<div class="contact-value">{USERS_DETAILS_XTRA_X200_LAST_PROMOTION}</div>
<!-- ENDIF -->Здесь условие <!-- IF {TAG_VALUE} --> истинно только если timestamp не равен 0, то есть дата действительно выбрана.
Примеры использования в плагинах и модулях
Регистрация экстраполя datetime
cot_extrafield_add(
'users',
'my_event_datetime',
'datetime',
'',
'',
'',
false,
'HTML',
'Дата события',
'2000,2030,datetime_medium'
);Сохранение из формы
$extrafield = [/* получить описание поля */];
$oldValue = $existing['user_my_event_datetime'] ?? 0;
$newValue = cot_import_extrafields('rxtra_my_event_datetime', $extrafield, 'P', $oldValue, 'xtra_');
// $newValue — Unix timestamp в UTCВывод в шаблоне
<!-- IF {USERS_DETAILS_XTRA_X200_LAST_PROMOTION_VALUE} -->
<div class="contact-label">{USERS_DETAILS_XTRA_X200_LAST_PROMOTION_TITLE}</div>
<div class="contact-value">{USERS_DETAILS_XTRA_X200_LAST_PROMOTION}</div>
<!-- ENDIF -->Или с прямым вызовом cot_date:
{PAGE_ROW_DATE_STAMP|cot_date('datetime_full', $this)}Заключение
Cotonti предоставляет мощный и гибкий инструментарий для работы с датами и временем. Благодаря функциям cot_date(), cot_import_date(), cot_selectbox_date() и предопределённым форматам $Ldt, разработчики могут легко выводить даты в нужном виде, учитывать локализацию и часовые пояса. Экстраполя типа datetime полностью интегрированы в эту систему, обеспечивая корректную работу с пользовательским вводом. При использовании в шаблонах важно помнить о проверке значений через теги _VALUE, чтобы избежать отображения пустых дат как «1 января 1970».
Еще по теме:
PHP: DateTimeInterface::format - Manual
Комментарии (0)
Автор контента
Онлайн
Sodium Carbonate
Последняя авторизация: 17.08.2026 00:16
- Страница размещена: 16.08.2026 21:08
- Последнее обновление: 16.08.2026 23:11
- Язык:
Связанные статьи
Примеры: Вывод даты создания статьи в Cotonti: все способы
Все основные модификации вывода даты создания статьи (PAGE_CREATED) В этой статье рассмотрены все
Экстраполя Cotonti: тип данных datetime — Дата и время
Экстраполя Cotonti: тип данных datetime — Дата и время Оглавление 1. Общие сведения 2. Хранение
Плагин xtradbrowusers — Руководство по тегам в шаблонах
Плагин 'xtradbrowusers' — Руководство по тегам в шаблонахИнтеграция и прописывание тегов для вывода
English