Работа с датами и временем
Вы можете использовать сравнение дат и времени, например, для попадания в рабочее время
Для упрощения понимания какой набор функций доступен на тарифе вводим систем у обозначений:
- доступно на Бесплатном тарифе

- доступно на Базовом тарифе

- доступно на тарифе Стандарт

- доступно на тарифе Премиум

Salebot работает со следующими форматами ДАТЫ и ВРЕМЕНИ:
для дат -"dd.mm.yyyy"
для времени - "HH:MM"
Для работы с датами и временем вы можете использовать следующие переменные:
current_date - текущая дата в формате dd.mm.yyyy
next_day - завтрашняя дата в формате dd.mm.yyyy. Удобно для отправки сообщения завтра.
current_time - московское время в формате hh:mm
weekday - день недели в виде числа, понедельник - 1, вторник -2
Быстрый доступ к описаниям функций:
Сравнивать даты и время можно логическими операторами так же, как и числа.
addYear() | addMonth() | addDays() | addMinutes()
Описание
Примеры
Пример кода для копирования
Видеоразбор
addYear(дата,лет_прибавить) - для вычисления даты через сложение с учетом високосного года заданной даты и количества лет. Для вычитания используйте отрицательное число.
addMonth(дата, месяцев_прибавить) - для вычисления даты через сложение с учетом високосного года заданной даты и количества месяцев. Для вычитания используйте отрицательное число.
addDays(дата, дней_прибавить) - для прибавления к дате указанного количества дней. Для вычитания передайте отрицательное число. Пример: addDays(current_date, 20) или addDays('20.08.2019', -99)
addMinutes(дата, минут_прибавить) прибавляет к указанному времени количество минут. Для вычитания передайте отрицательное число. Пример: addMinutes(current_time, 20) или addMinutes('20:08', -30)
'дата' + дни прибавляет к дате указанное количество дней
'время' + минуты прибавляет к дат указанное количество минут
Пример - прибавим к дате некое количество лет:


Пример - прибавим к дате некое количество месяцев:


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


kol = 2
data = '29.02.2020'
x = addYear(data, kol)
y = addYear('31.12.2021', -1*kol)
kol = 10
data = '30.04.2019'
x = addMonth(data, kol)
y = addMonth('31.12.2020', -1*kol)
kol = 10
data = '30.04.2019'
x = addMonth(data, kol)
y = addMonth('31.12.2020', -1*kol)
Описание
Примеры
Видеоразбор
Сравнивать даты и время можно логическими операторами, так же как и числа:
больше >, меньше <
равно ==, не равно !=
больше или равно >=, меньше или равно <=
При этом условия сравнения можно связывать между собой логическими операциями и AND, или OR
Условие сравнения должно быть логически верным, т.е. нельзя строить условия по типу a == 1 and a != 1, так как число не может быть одновременно равно и не равно 1.
Записываются условия сравнения в поле Переменная для сравнения

подраздел Условия в блоках с условиями и стрелках
При указании условий сравнения в стрелке обязательно используйте задержки

'01.09.2020'
< '11.10.2020'
'11.10.2020' >=
current_date
current_date == date
current_time >= '18:00'
current_time <= '21:00'
Описание
Пример
Пример кода для копирования
Видеоразбор
Очень удобная функция, позволяющая работать с временными интервалами, это:
time_interval('Время_начало','Время_конец')
Результат выполнения функции логическое True или False
Используйте функцию в блоках как условие в Переменной для сравнения или в Калькуляторе в IF()
time_interval('10:00','19:00') - проверка временного интервала с 10 утра до 7 вечера
time_interval('19:00','8:00') - проверка временного интервала с 7 вечера до 8 утра
time_interval('18.10.2021 10:00','25.10.2021 23:59:59') - проверка временного интервала между разными датами
time_interval('#{current_date} 10:00','#{date} 19:00') - проверка временного интервала, заданного с помощью переменных
Разберем подроебнее первый пример, дословно функция читается:
Если пользователь напишет слово "время" в период с 10 утра до 7 вечера, то условие истинно, иначе ложь.
Таким образом, можно реализовать разные ответы в зависимости от времени обращения клиента. Например, при попадании во временной интервал с 10 утра до 7 вечера клиент получит ответ "Вам скоро ответит менеджер", в другое время он получит в ответ "Сейчас менеджер не на месте, вам ответят в рабочее время с 10:00"
Запишем в поле "Калькулятор":
ответ = if(time_interval('10:00','19:00'), "Вам скоро ответит менеджер", "Сейчас менеджер не на месте, вам ответят в рабочее время с 10:00")
а в поле Сообщение - #{ответ}

Настройка блока на типовой автоответчик

Тестируем функцию timeinterval()
ответ = if(time_interval('10:00','19:00'), "Вам скоро ответит менеджер", "Сейчас менеджер не на месте, вам ответят в рабочее время с 10:00")

Для решения задачи сколько времени осталось до дня D:
Задаём дату и время момента, до которого считаем время:
date_D = 10.10.2021 time_D = 12:00
Конвертируем в формат timestamp:
timestampD = convert_datetime("#{date_D} #{time_D}", "%d.%m.%Y %H:%M", "%s")
Фиксируем текущее время в формате timestamp:
timestamp0 = #{timestamp}
Округляем полученные значения до целого:
timeD = int(#{timestampD}) time0 = int(#{timestamp0})
Вычисляем разницу в секундах:
time = timeD - time0
Делим на количество секунд в сутках, и округляем полученное значение:
суток = time/86400
дней = int(#{суток})
Выясняем сколько секунд осталось от неполных суток:
c = дней*86400
d = time - c
Считаем сколько это в часах и округляем:
e = d/3600 часов = int(e)
Выясняем сколько секунд осталось от неполных часов:
g = часов*3600
h = d - g
Переводим это в минуты и округляем:
i = h/60
минут = int(i)
Выясняем сколько секунд осталось:
k = минут*60
секунд = h - k
И выводим время в поле Текст сообщения:
До старта осталось #{дней} дней #{часов} часов #{минут} минут и #{секунд} секунд
Код для вставки в калькулятор:
timestampD = convert_datetime("#{date_D} #{time_D}", "%d.%m.%Y %H:%M", "%s")
timestamp0 = #{timestamp}
timeD = int(#{timestampD})
time0 = int(#{timestamp0})
time = timeD - time0
суток = time/86400
дней = int(#{суток})
c = дней*86400
d = time - c
e = d/3600
часов = int(e)
g = часов*3600
h = d - g
i = h/60
минут = int(i)
k = минут*60
секунд = h - k

Подсчет сколько дней до заявленной даты (21.12.2021)

Подсчет сколько минут до заданного времени заданной даты 15:00 16.12.2021
Так же калькулятор поддерживает вычитание даты и времени без приведения типов. Например:
'11.12.2021' - '8.12.2021' вернет 3 (дня)
'11:12' - '3:45' вернет 447 (минут)
Для того, чтобы бот мог поздравить человека можно использовать функцию
birthdate(дата) - она возвращает ближайший день рождения. На вход принимает дату рождения человека. Например:
напоминание = birthdate('28.04.1994')
Если у вас периодичные рассылки по дням недели, вы можете получать дату дня недели, чтобы запланировать рассылку.
weekday_date(weekday, b) - возвращает дату ближайшего дня недели. Принимает два параметра. Первый параметр день недели, дату которого необходимо определить (от 1 до 7). Второй параметр показывает, возвращать ли сегодняшнюю дату, если нужный день сегодня. Второй параметр можно не указывать, по умолчанию False. Его значение давайте рассмотрим на примере:
Допустим, вы настраиваете отправку сообщения в рассылке так, чтобы оно приходило именно в четверг. Но как же быть, если клиент только зарегистрировался в четверг?
Отправлять ему сообщение в этот четверг или в следующий?
Второй параметр False означает, что сообщение будет отправлено только в следующий четверг.
Второй параметр True означает, что оно будет отправлено и в тот четверг, когда пользователь только зарегистрировался.
В нашем примере пользователь регистрируется в четверг 13.02.2020. И сообщение мы ему хотим отправить в следующий четверг. Значит, возвращаемое значение: "20.02.2020".
Например,
weekday_date(4)
вернет '20.02.2020'.Если текущий день вам подходит только до определенного времени, то можно использовать такую конструкцию:
weekday_date(4, current_time < '13:00')
, где условие можно заменить на нужное вам.Если у вас периодичные действия в определенный день месяца, вы можете получать дату для ближайшего дня месяца, чтобы запланировать рассылку.
month_date(date, b) - возвращает ближайшую дату месяца на указанное в параметре число дня. Принимает два параметра. Первый параметр date - число дня, для которого необходимо определить ближайшую дату (от 1 до 31). Второй параметр b показывает, возвращать ли сегодняшнюю дату, если нужный день сегодня. Второй параметр можно не указывать, по умолчанию False.
Если передать число 31, а в текущем месяце 30 дней, то функция вернет дату на 30 число.
Например, если сегодня 5.04.2022, а мы вызываем функцию t=month_date(1), то в результате получим дату 01.05.2022.
Допустим компания работает с утра 9 до 6 вечера и не работает в субботу и воскресенье.
Все рекомендуется делать по шагам. Сначала поставим проверку попадания в рабочее время:
current_time >= '9:00' AND current_time <= '18:00'
По аналогии НЕ рабочее время:
current_time < '9:00' OR current_time > '18:00'
Дальше добавим проверку не написали ли нам в выходные, для этого нам понадобится weekday:
weekday != 6 AND weekday != 7
Соединим вместе. Условие, что написали в рабочее время:
current_time >= '9:00' AND current_time <= '18:00' AND weekday != 6 AND weekday != 7
Противоположное условие, что написали НЕ в рабочее время:
current_time < '9:00' OR current_time > '18:00' OR weekday == 6 OR weekday == 7

Формат даты времени везде используется разный и, возможно, один из интегрированных ресурсов вернет время не в том формате, который понимает salebot. Вам нужно будет его конвертировать.
convert_datetime(date, fin, f_out) - для конвертации даты и времени
3 параметра: строка даты, строка формата входной строки, строка формата результата. Пример:
convert_datetime("2011-11-03", "%Y-%m-%d", "%Y/%m/%d") на выходе будет 2011/11/03
Функция получения текущего времени в определенном формате get_datetime. 1 параметр: в каком формате вернуть время. Пример:
get_datetime("%A") на выходе будет Среда
Описание параметров строки формата:
Директива | Значение | Пример |
%a | Сокращенное значение дня недели | Вс, Пн.. |
%A | Полное название дня недели | Понедельник, Вторник, …, Воскресенье |
%w | День недели как десятичное число, где 0 воскресенье и 6 суббота | 0, 1, …, 6 |
%d | День месяца в виде десятичного числа с нулями | 01, 02, …, 31 |
%b | Месяц как аббревиатура | янв, фев, …, дек |
%B | Полное название месяца | Январь, Февраль... |
%m | Месяц в виде десятичного числа с нулями | 01, 02, …, 12 |
%y | Год в виде двузначного числа | 00, 01, …, 99 |
%Y | Четырехзначное значение года | 0001, 0002, …, 2013, 2014, …, 9998, 9999 |
%H | Час (24-часовой формат) двузначное значение | 00, 01, …, 23 |
%I | Час (12-часовой формат) двузначное значение | 01, 02, …, 12 |
%p | Эквивалент AM или PM. | AM, PM (en_US);am, pm (de_DE) |
%M | Минуты в двузначном формате | 00, 01, …, 59 |
%S | Секунды в двузначном формате | 00, 01, …, 59 |
%f | Микросекунды в шестизна | 000000, 000001, …, 999999 |
%z | UTC offset in the form ±HHMM[SS[.ffffff]] (empty string if the object is naive). | (empty), +0000, -0400, +1030, +063415, -030712.345216 |
%Z | Time zone name (empty string if the object is naive). | (empty), UTC, GMT |
%j | Трезначное значение дня года | 001, 002, …, 366 |
%U | Номер недели в году (воскресенье как первый день недели) в виде десятичного числа, дополненного нулями. Все дни нового года, предшествующие первому воскресенью, считаются нулевой неделей. | 00, 01, …, 53 |
%W | Номер недели в году (понедельник как первый день недели) в виде десятичного числа. Все дни нового года, предшествующие первому понедельнику, считаются нулевой неделей. | 00, 01, …, 53 |
%% | Символ '%' | % |
%s | timestamp | 1607926200 |
Все остальные символы означают сами себя.
Получить текущий timestamp можно: convert_datetime("#{current_date} #{current_time}", "%d.%m.%Y %H:%M", "%s")
чтобы вывести дату в виде »dd название месяца», воспользуйтесь функцией current_date_rus(). Она выведет сегодняшнюю дату в виде числа и названия месяца в родительном падеже, например, 3 апреля.
Если Вам потребуется прибавить определенное количество дней к данной дате, следует вписать нужное количество дней в параметры функции.
Например, если сегодняшняя дата - 3 апреля, тогда функция вернет:
current_date_rus() - 3 апреля
current_date_rus(2) - 5 апреля
current_date_rus(-2) - 1 апреля
Для вывода заданной даты в виде «dd название месяца» используйте функцию
date_rus(date, num), где
date - это дата в формате dd.mm.yyyy,которую необходимо перевести в вид 26 октября, например, 26.10.2022;
num - количество дней, которые нужно отнять/прибавить.
Например, для даты 19.07.2022 функция вернет:
date_rus(‘19.07.2022’) - 19 июля
date_rus(‘19.07.2022’,2) - 21 июля
date_rus(‘19.07.2022’,-2) - 17 июля
Last modified 12d ago