Отображение дат и времени в 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.

Алгоритм работы 

  1. Если $timestamp не задан, берётся Cot::$sys['now'].
  2. Timestamp приводится к целому числу: (int)$timestamp.
  3. Если $usertimezone === true, к timestamp прибавляется смещение часового пояса пользователя: $timestamp += Cot::$usr['timezone'] * 3600. Это переводит время из UTC в локальное время пользователя.
  4. Если ключ $format существует в массиве $Ldt, используется соответствующая строка формата, иначе — сам $format.
  5. Вызывается PHP-функция date() с полученной строкой формата.
  6. Для неанглийских языков выполняется замена английских названий дней недели и месяцев на локализованные значения из массива $L.
  7. Возвращается отформатированная строка.

Пример использования

$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_fulld.m.Y16.08.2026
date_mediumm.Y08.2026
date_shortd.m16.08
date_textd F Y16 августа 2026
date_fulltextl, d F YВоскресенье, 16 августа 2026
time_fullH:i:s14:31:30
time_mediumG:i14:31
time_shorti:s31:30
time_textg:i A2:31 PM
time_fulltextg:i:s A2:31:30 PM
datetime_fulld.m.Y H:i:s16.08.2026 14:31:30
datetime_mediumd.m.Y H:i16.08.2026 14:31
datetime_shortd.m H:i16.08 14:31
datetime_textd F Y H:i16 августа 2026 14:31
datetime_fulltextl, d F Y H:iВоскресенье, 16 августа 2026 14:31
week_fullo-\WW2026-W34
week_medium\WWW34
week_short\WW-NW34-7
week_text\WW, lW34, Воскресенье
week_fulltexto-\WW, l2026-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).

Алгоритм работы

  1. Проверяет наличие кастомной функции cot_import_date_custom() и хука import.date.
  2. Пытается получить массив из источника с ключами year, month, day, hour, minute.
  3. Если массив пуст, пробует прочитать значение как обычную строку (например, '2026-08-16 14:30').
  4. Если это строка, преобразует её в timestamp через cot_date2stamp().
  5. Если получен массив:
    • Проверяет, все ли компоненты равны null (пустая дата) → возвращает null.
    • Если условие ($month && $day && $year) || ($day && $minute) истинно, собирает timestamp через cot_mktime($hour, $minute, 0, $month, $day, $year).
    • В противном случае использует дополнительные поля string и format, если они есть.
  6. Если $usertimezone === true, вычитает часовой пояс пользователя: $timestamp -= Cot::$usr['timezone'] * 3600. Это приводит время к UTC перед сохранением.
  7. Возвращает 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'):

  1. Разбираются параметры min, max, format.
  2. Обрабатываются относительные даты: если значение начинается с + или -, оно интерпретируется как смещение в секундах от текущего времени $sys['now']. Например, +86400 — завтра.
  3. Вызывается cot_selectbox_date((int)$data, 'long', $name, (int)$max, (int)$min, true, $extrafield['field_html']).

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

Импорт и сохранение

При сохранении формы вызывается cot_import_extrafields() (ветка case 'datetime'):

  1. Вызывает cot_import_date($inputname, true, false, $source).
  2. Если результат null, устанавливает $import = 0.
  3. Если заданы min или max (больше 0), проверяет год полученной даты и при необходимости корректирует его, сохраняя остальные компоненты.
  4. Если поле обязательное и итоговое значение 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

PHP: date - Manual


Вернуться к началу

9 минут чтения Sodium Carbonate

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

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Похожие страницы

Форматирование дат и времени в Cotonti
1 Форматирование дат и времени в CotontiВ Cotonti даты и время по умолчанию отображаются в удобном для большинства
Полное руководство по настройке ЧПУ для модуля Forums в Cotonti
2 Это руководство поможет вам настроить красивые URL для разделов, тем и сообщений форума Cotonti. В результате
Подготовка дат в Excel и Google Таблицах для импорта в Cotonti
3 Подготовка дат в Excel и Google Таблицах для импорта в CotontiЦель документаДанный материал предназначен для
Вывод дат в шаблонах Cotonti (Форматы и примеры в тегах)
4 Вывод дат в шаблонах CotontiНастройка формата отображения: локально и глобальноВ системе Cotonti все даты внутри базы
Преобразование Дат в Excel и Google Sheets
5 Преобразование Дат в Excel и Google Sheets для Импорта в CotontiЭта документация фокусируется на практических