Заметки
Как в БП прибавлять и вычитать дни, часы и минуты
Как в бизнес-процессах 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"))}} Здесь важно не смешивать два разных сценария: «рассчитать дату» и «показать дату человеку». Для расчёта лучше держать значение как дату/время, а форматировать его уже в тексте уведомления или комментария.