1с битрикс формат показа даты и времени в публичном разделе сайта определяется
С самого начала работы с Битрикс меня порядком раздражало обилие методов и функций для работы с датой. Даже сейчас я заглядываю в хелп, чтобы узнать про тот или иной метод. И частенько смотрю в код, чтобы вспомнить, какие запросы есть/нет у той или иной функции. Пришло время покончить с этим и вынести в одно место все это дело.
Выставил функции в порядке частоты применения на практике. Еще раз подчеркну отличительную особенность всех стандартных функций - они учитывают формат текущего сайта и позволяют делать вам решения универсальными. Так же кое-где учитываются часовые пояса, что тоже порой важно.
Самые частые
$DB->FormatDate - изменение формата даты на другой.
Применяется: когда надо изменить формат даты. Например, в шаблоне компонента, или для передачи в фильтр. На мой взгляд слишком громоздка, предпочитаю юзать простенькие свои обертки конкретно под задачи (например, стараюсь получить timestamp еще в запросе, а потом вывести нормальным date().
FormatDate - это не метод, это отдельная функция. И на вход принимает timestamp. Имеет очень богатый набор параметров. За это, на мой взгляд, платим чересчур бОльшей нагрузкой.
Применяется: ну когда очень хочется вывести "две минуты назад".
FormatDateFromDB - обертка вышеописанной функции. Позволяет довольно хитро вертеть данными. На мой взгляд - экзотика. Приведу примеры:
С другой стороны может довольно гибко использоваться и в реально нужном контексте:
MakeTimeStamp - возвращает timestamp по дате.
Применяется: очевидно.
AddToTimeStamp - позволяет добавить период к timestamp. Например, +1 год и 1 месяц.
Применяется: кому как, мне проще перегнать в timestamp и добавить что хочу.
ParseDateTime - вычленяет дни, месяцы, года, время из строки даты по формату.
Применяется: например, надо из даты формата FORMAT_DATETIME достать год. Мы же не знаем какой формат точно.
$DB->DateFormatToPHP - простенькая функция, которая позволяет перегнать формат даты сайта (или другой) в формат PHP date. Например, YYYY-DD-MM превратит в Y-d-m.
Применяется: чаще всего применяется для перегона формата сайта в php-формат. Рекомендуется по причине совместимости (вы никогда не знаете какой именно формат сайта может быть на сайте). Очень частое применение - при формировании фильтра по датам в тех же инфоблоках . Даже вынесу сюда самый популярный копипаст (до сих пор за ним лезу в хелп )
(Фильтр для инфоблоков, приказывающий вывести элементы с датой активности менее месяца назад)
$DB->CompareDates - сравнивает даты. Все бы хорошо, но использует запрос без кеширования к базе. Соответственно, применять следует по уму, без участия в циклах.
Применяется: если честно, ни разу не было случая, когда без этой функции никуда (чаще всего мешает именно запрос к БД). Обычно хватало фильтров на уровне БД, или перевода в time.
Ниже идут функции для применения в ваших запросах напрямую к БД. Как правило, это разработка модулей.
$DB->CharToDateFunction - является оберткой $DB->FormatDate, переводит дату в формат БД (YYYY-MM-DD HH:MI:SS). То есть, фактически, это то же самое, что:
Но! Использует внутри себя работу с часовыми поясами, добавляя DATE_ADD , если требуется.
Применяется: исключительно когда надо передать фильтр/сортировку по дате в ваш запрос (уже в безопасном виде). Для передачи в фильтр методов не подходит, так как обрамляет строку кавычками.
$DB->CurrentDateFunction - возвращает CURRENT_DATE для MySQL и TRUNC(SYSDATE) для Oracle. Имеет напарницу CurrentTimeFunction , для времени.
Применяется: в ваших запросах, чтобы не греть голову о том, под Мускулом или под Ораклом вы работаете.
$DB->DateToCharFunction - перегоняет дату из формата БД в формат текущего сайта. То есть, Query вам сразу вернет дату в формате сайта, каким бы хитрым он не был. Очень удобно.
Применяется: выше.
Пару слов о форматах времени.
Их есть всего два: FORMAT_DATETIME и FORMAT_DATE. Это константы и они определены всегда в публичной части. Но вообще, когда вы не уверены, где будет работать решение/скрипт, его желательно заменять на CSite::GetDateFormat (старая интерпретация CLang::GetDateFormat). Если константы выше определены, она сразу их и вернет. Нет - начнет копать дальше.
Я не стал перечислять явные велосипеды, или обертки. Если что-то важное все же упустил - пожалуйста, в комменты.
Читайте также: