Работа с датой в Битрикс

Фильтрация по дате активности

Для $arFilter использовать DATE_ACTIVE_FROM, DATE_ACTIVE_TO, подробнее

Приведение даты в PHP-формат

Элементы имеют следующие параметры:

  • CREATED_DATE - дата создания БЕЗ учета времени
  • DATE_CREATE - дата создания с учетом времени
bitrix-date-format.php
$date = DateTime::createFromFormat('Y.m.d', $item['CREATED_DATE']); // только дата
$date = DateTime::createFromFormat('d.m.Y H:i:s', $item['DATE_CREATE']); // дата и время

Для свойств:

bitrix-date-property.php
$date = DateTime::createFromFormat('d.m.Y H:i:s', $item['PROPERTY_SOME_DATE_VALUE']);

Разница в днях между датами

Разница в днях между датой элемента и текущей датой:

bitrix-date-diff.php
$date = DateTime::createFromFormat('d.m.Y H:i:s', $item['PROPERTY_SOME_DATE_VALUE']);
$now = new DateTime();
$dayDiff = $date->diff($now)->format('%a');

:!: Возможно, что битрикс хранит дату записи в одной зоне, а текущее время new DateTime() - в другой. Поэтому разница только что созданной записи и текущего времени таким образом может быть не равна нулю!

Округление идет в меньшую сторону, т.е. разница в 23 часа 59 мин 59 сек = 0 дней. Можно сказать, что если $date->diff($now)->format('%a') >= 1, прошло минимум 24 часа.

Точное значение в годах, месяцах, днях, часах, минутах и секундах:

date-diff.php
die(var_dump(
  $date->diff($now)->format('%Y-%M-%D %H:%I:%S')
));

Разница в секундах - именно не по секундам, а общая в секундах:

date-diff-seconds.php
$diff = $now->getTimestamp() - $date->getTimestamp();

Отмотать дату

Отмотать дату на начало предыдущего дня ($numDays = 1) или позавчера ($numDays = 2), причем с округлением до полуночи:

back-in-time.php
$now = new DateTime('now');
$intervalStart = clone $now;
$intervalStart->modify(sprintf('-%s day', $numDays))->setTime(0, 0, 0); // 2016-05-04 00:00:00

Начало месяца и начало квартала

Дата начала месяца и квартала для текущей даты.

current-quarter.php
$monthDate = new DateTime(); // текущая дата
$curDay = $monthDate->format('j');
$curMonth = $monthDate->format('n');
$curQuarter = ceil($curMonth / 3); // номер текущего квартала
$quarterDeltaMonth = ($curMonth - 1) % 3;
 
if($curDay != 1) {
  $monthDate->modify(sprintf('-%d day', $curDay - 1)); // начало месяца
}
$quarterDate = clone $monthDate;
$quarterDate->modify(sprintf('-%d month', $quarterDeltaMonth)); // начало квартала