Дата и время

Сервер витрины и её посетители живут в разных часовых поясах, а база данных — в третьем. Чтобы это не приходилось держать в голове в каждом модуле, платформа даёт один метод, который всегда работает в поясе проекта.

DateTime

DateTime($mHow = 'now', $mFormat = "Y-m-d H:i:s") возвращает отформатированную дату в часовом поясе проекта, заданном в конфигурации (MELBIS_TIME_ZONE), а не в поясе сервера. Формат по умолчанию — тот, в котором даты хранятся в БД, поэтому метод одинаково удобен и для записи в таблицу, и для вывода посетителю.

// Текущее время в формате БД
$now = MELBIS()->DateTime();

// Разбор строки и произвольный формат
$year = MELBIS()->DateTime($store['create_time'], 'Y');

// Относительные выражения понимаются, как в strtotime
$deadline = MELBIS()->DateTime('now + 3 day');

// Число на входе трактуется как UNIX timestamp
$stamp = MELBIS()->DateTime(1767225600, 'd.m.Y');

Первый аргумент принимает три вида значений: строку с датой из базы, строку с относительным выражением ('now + 3 day', 'last monday') и число — оно трактуется как UNIX-timestamp. Второй аргумент — обычная строка формата PHP.

Пользуйтесь DateTime вместо date(): на сервере, живущем в UTC, date() покажет посетителю не то время, которое он ожидает увидеть, и запишет в базу дату, разъезжающуюся с остальными.

Даты в шаблонах

В вёрстке дату форматировать через PHP не нужно — для этого есть модификаторы date и idate (второй подставляет название месяца на текущем языке витрины). Из модуля дата передаётся как есть, в том виде, в каком лежит в базе:

MELBIS()->TplAssign($tpl, 'ORDER', $order);
Заказ от {ORDER:CREATE_TIME|idate:d MMMM yyyy}

У idate формат задаётся в стандарте ICU, а не PHP, — подробнее в разделе «Модификаторы».