+7 495 008 8452 пн.-пт. 10:00 – 17:00
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Шпаргалка по работе с датой/временем в Битрикс

С самого начала работы с Битрикс меня порядком раздражало обилие методов и функций для работы с датой. Даже сейчас я заглядываю в хелп, чтобы узнать про тот или иной метод. И частенько смотрю в код, чтобы вспомнить, какие запросы есть/нет у той или иной функции. Пришло время покончить с этим и вынести в одно место все это дело.

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


Самые частые


$DB->FormatDate - изменение формата даты на другой.
Применяется: когда надо изменить формат даты. Например, в шаблоне компонента, или для передачи в фильтр. На мой взгляд слишком громоздка, предпочитаю юзать простенькие свои обертки конкретно под задачи (например, стараюсь получить timestamp еще в запросе, а потом вывести нормальным date().


FormatDate - это не метод, это отдельная функция. И на вход принимает timestamp. Имеет очень богатый набор параметров. За это, на мой взгляд, платим чересчур бОльшей нагрузкой.
Применяется: ну когда очень хочется вывести "две минуты назад".


FormatDateFromDB - обертка вышеописанной функции. Позволяет довольно хитро вертеть данными. На мой взгляд - экзотика. Приведу примеры:
echo FormatDateFromDB('01/23/2013', 'DD MMMM YYYY'); // вернет 23 Enero 2013, если язык сайта испанский
echo FormatDateFromDB('7 June 2012 12:00pm', 'SHORT'); // вернет 7 Июня 2012, если язык сайта русский и короткий формат языка - DD MMMM YYYY

С другой стороны может довольно гибко использоваться и в реально нужном контексте:
$arElem['ACTIVE_TO'] = FormatDateFromDB($arElem['ACTIVE_TO'], 'SHORT');//перегон из формата FULL в формат SHORT


MakeTimeStamp - возвращает timestamp по дате.
Применяется: очевидно.


AddToTimeStamp - позволяет добавить период к timestamp. Например, +1 год и 1 месяц.
Применяется: кому как, мне проще перегнать в timestamp и добавить что хочу.


ParseDateTime - вычленяет дни, месяцы, года, время из строки даты по формату.
Применяется: например, надо из даты формата FORMAT_DATETIME достать год. Мы же не знаем какой формат точно.


$DB->DateFormatToPHP - простенькая функция, которая позволяет перегнать формат даты сайта (или другой) в формат PHP date. Например, YYYY-DD-MM превратит в Y-d-m.
Применяется: чаще всего применяется для перегона формата сайта в php-формат. Рекомендуется по причине совместимости (вы никогда не знаете какой именно формат сайта может быть на сайте). Очень частое применение - при формировании фильтра по датам в тех же инфоблоках. Даже вынесу сюда самый популярный копипаст (до сих пор за ним лезу в хелп :))
'>DATE_ACTIVE_FROM' => date($DB->DateFormatToPHP(FORMAT_DATETIME), time()-86400*30),
(Фильтр для инфоблоков, приказывающий вывести элементы с датой активности менее месяца назад)


$DB->CompareDates - сравнивает даты. Все бы хорошо, но использует запрос без кеширования к базе. Соответственно, применять следует по уму, без участия в циклах.
Применяется: если честно, ни разу не было случая, когда без этой функции никуда (чаще всего мешает именно запрос к БД). Обычно хватало фильтров на уровне БД, или перевода в time.


Ниже идут функции для применения в ваших запросах напрямую к БД. Как правило, это разработка модулей.


$DB->CharToDateFunction - является оберткой $DB->FormatDate, переводит дату в формат БД (YYYY-MM-DD HH:MI:SS). То есть, фактически, это то же самое, что:
$DB->FormatDate($arGetFilter['date_payed_to'], FORMAT_DATETIME, '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). Если константы выше определены, она сразу их и вернет. Нет - начнет копать дальше.


Заключение

Я не стал перечислять явные велосипеды, или обертки. Если что-то важное все же упустил - пожалуйста, в комменты.

Назад в раздел

Подписаться на новые материалы раздела:












CAPTCHA