Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.
Шпаргалка по работе с датой/временем в Битрикс
С самого начала работы с Битрикс меня порядком раздражало обилие методов и функций для работы с датой. Даже сейчас я заглядываю в хелп, чтобы узнать про тот или иной метод. И частенько смотрю в код, чтобы вспомнить, какие запросы есть/нет у той или иной функции. Пришло время покончить с этим и вынести в одно место все это дело. Выставил функции в порядке частоты применения на практике. Еще раз подчеркну отличительную особенность всех стандартных функций - они учитывают формат текущего сайта и позволяют делать вам решения универсальными. Так же кое-где учитываются часовые пояса, что тоже порой важно.
Самые частые
$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-формат. Рекомендуется по причине совместимости (вы никогда не знаете какой именно формат сайта может быть на сайте). Очень частое применение - при формировании фильтра по датам в тех же инфоблоках. Даже вынесу сюда самый популярный копипаст (до сих пор за ним лезу в хелп )
(Фильтр для инфоблоков, приказывающий вывести элементы с датой активности менее месяца назад)
$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). Если константы выше определены, она сразу их и вернет. Нет - начнет копать дальше.
Заключение
Я не стал перечислять явные велосипеды, или обертки. Если что-то важное все же упустил - пожалуйста, в комменты.