← Назад к заметкам

Заметки

Как в БП прибавлять и вычитать дни, часы и минуты

Как в бизнес-процессах Bitrix24 менять дату через dateadd и strtotime, форматировать результат и не запутаться в часовом поясе.

Для обычных сдвигов даты чаще всего нужен dateadd: плюс два дня, минус час, плюс 30 минут. strtotime удобнее для относительных текстовых дат вроде next Monday или first day of next month.

Задача

В бизнес-процессах Bitrix24 часто нужно получить новую дату относительно старой: прибавить несколько дней к дате создания, вычесть час из дедлайна или поставить напоминание через 30 минут.

Главное — не пытаться складывать дату как обычное число. Для таких расчётов в выражениях есть функции работы с датами.

Чаще всего хватает двух подходов:

  • dateadd — для точного сдвига на дни, часы, минуты и секунды;
  • strtotime — для относительных дат, записанных текстом на английском языке.

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

Обычное прибавление и вычитание

Если нужно просто прибавить или вычесть конкретный интервал, используйте dateadd.

Прибавить 2 дня к текущей дате и времени:

{{=dateadd({=System:NowLocal}, "+2d")}}

Вычесть 1 день из даты создания документа:

{{=dateadd({=Document:DATE_CREATE}, "-1d")}}

Прибавить 3 часа:

{{=dateadd({=System:NowLocal}, "+3h")}}

Вычесть 45 минут:

{{=dateadd({=System:NowLocal}, "-45i")}}

Прибавить сразу несколько единиц времени:

{{=dateadd({=System:NowLocal}, "2 days 3 hours 30 minutes")}}

Короткие обозначения обычно такие: d — дни, h — часы, i — минуты, s — секунды. В документации также встречаются полные английские слова: days, hours, minutes. Для минут лучше использовать i или minutes, а не m: такая запись легко путается с месяцами.

Если количество хранится в переменной или параметре БП, интервал нужно собрать строкой через конкатенацию:

{{=dateadd({=System:NowLocal}, "+" & {=Variable:MinutesCount} & "i")}}

Для вычитания знак минуса тоже лучше добавлять явно:

{{=dateadd({=System:NowLocal}, "-" & {=Variable:HoursCount} & "h")}}

Когда нужен strtotime

strtotime полезен, когда дату проще описать относительной фразой: «следующий понедельник», «первый день следующего месяца», «через неделю и два часа».

Следующий день:

{{=strtotime("next day")}}

Через неделю:

{{=strtotime("+1 week")}}

Следующий понедельник:

{{=strtotime("next Monday")}}

Первый день следующего месяца:

{{=strtotime("first day of next month")}}

Сразу несколько частей интервала:

{{=strtotime("+1 week 2 days 4 hours 30 minutes")}}

Важный нюанс: строки для strtotime пишутся на английском языке. Формат вроде "следующий понедельник" использовать не стоит.

Ещё один нюанс — strtotime использует часовой пояс сервера. Если дата завязана на конкретного пользователя, это нужно учитывать отдельно.

Форматирование результата

Когда результат нужно записать в поле типа Дата/время, обычно достаточно вернуть саму дату из dateadd или strtotime. Форматирование чаще нужно для текста уведомления, комментария или сообщения.

Вывести дату в виде дд.мм.гггг чч:мм:

{{=date("d.m.Y H:i", dateadd({=System:NowLocal}, "+2d"))}}

Вывести только дату:

{{=date("d.m.Y", dateadd({=System:NowLocal}, "+7d"))}}

Вывести только время:

{{=date("H:i", dateadd({=System:NowLocal}, "+30i"))}}

Иногда такую задачу называют «сделать formatDate». В выражениях БП обычно используется функция date. А если расчёт выполняется уже внутри PHP-кода, там можно использовать PHP/Битрикс-функции форматирования, например FormatDate.

Для заполнения CRM-поля лучше не превращать дату в красивую строку без необходимости. Если поле ожидает дату, передавайте дату. Если нужен текст для уведомления — форматируйте.

Если нужно сохранить часы и минуты, поле должно быть типа Дата/время, а не просто Дата. Иначе расчёт может быть верным, но время в поле не сохранится.

Локальное время и часовые пояса

С датами в БП легко ошибиться не в формуле, а в часовом поясе. Особенно если портал используют сотрудники из разных регионов.

Основные системные значения:

  • {=System:Now} — текущие дата и время сервера;
  • {=System:NowLocal} — текущие дата и время пользователя с учётом его часового пояса;
  • {=System:Date} — текущая дата без времени.

Если робот должен считать срок так, как его видит пользователь, чаще всего удобнее начинать с {=System:NowLocal}.

Для вывода или преобразования даты можно использовать модификаторы:

  • {=Variable:Datetime > local} — дата во времени пользователя;
  • {=Variable:Datetime > server} — дата во времени сервера;
  • {=Variable:Datetime > responsible} — дата во времени ответственного.

Если нужно привести дату к часовому поясу конкретного сотрудника, можно использовать touserdate:

{{=touserdate('user_5', dateadd({=System:Now}, "+2h"))}}

Здесь важно не смешивать два разных сценария: «рассчитать дату» и «показать дату человеку». Для расчёта лучше держать значение как дату/время, а форматировать его уже в тексте уведомления или комментария.