Работа с датами и временем
MaviBot работает со следующими форматами ДАТЫ и ВРЕМЕНИ:
для даты – "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(date, years_to_add) - вычисляет новую дату, добавляя к заданной дате указанное количество лет с учётом високосных годов. Используйте отрицательное число, чтобы вычесть годы.
addMonth(date, months_to_add) - вычисляет новую дату, добавляя к заданной дате указанное количество месяцев с учётом високосных годов. Используйте отрицательное число, чтобы вычесть месяцы.
addDays(date, days_to_add) - добавляет к дате указанное количество дней. Используйте отрицательное число, чтобы вычесть дни. Пример: addDays(current_date, 20) или addDays('20.08.2019', -99)
addMinutes(time, minutes_to_add) - добавляет ко времени указанное количество минут. Используйте отрицательное число, чтобы вычесть минуты. Пример: addMinutes(current_time, 20) или addMinutes('20:08', -30)
'date' + дни - добавляет к дате указанное количество дней
'time' + минуты - добавляет ко времени указанное количество минут
Примеры
Пример добавления определённого количества лет к дате:


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


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


Пример кода для копирования
count = 2
date = '29.02.2020'
x = addYear(date, count)
y = addYear('31.12.2021', -1*count)
count = 10
date = '30.04.2019'
x = addMonth(date, count)
y = addMonth('31.12.2020', -1*count)
count = 10
date = '30.04.2019'
x = addMonth(date, count)
y = addMonth('31.12.2020', -1*count)
Как сравнивать время
Описание
Вы можете сравнивать даты и время с помощью логических операторов так же, как числа: больше чем > , меньше чем < равно == , не равно != больше или равно >= , меньше или равно <=
Условия сравнения также можно объединять с помощью логических операторов AND и OR.
Условия сравнения должны быть логически непротиворечивыми, то есть нельзя создавать условия вроде a == 1 и 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('start_time', 'end_time')
Функция возвращает логическое значение True или False.
Используйте эту функцию в блоках как условие в поле "Переменная для сравнения" или в калькуляторе с помощью IF().
Функция позволяет проверить, попадает ли текущее время в указанный интервал.
Пример
time_interval('10:00','19:00') - проверяет интервал времени с 10:00 до 19:00
time_interval('19:00','07:00') - проверяет интервал времени с 19:00 до 07:00
time_interval('18.10.2021 10:00','25.10.2021 23:59:59') - проверяет интервал времени между разными датами
time_interval('#{current_date} 10:00','#{date} 19:00') - проверяет интервал времени, заданный с помощью переменных
Давайте подробнее рассмотрим первый пример. Функция читается так:
Если пользователь отправляет сообщение со словом "time" в период с 10:00 до 19:00, условие возвращает true; в противном случае — false.
Это позволяет создавать разные ответы в зависимости от времени обращения клиента. Например, если текущее время между 10:00 и 19:00, клиент получит: "Менеджер скоро ответит вам."
В любое другое время он получит: "Сейчас менеджер недоступен; вы получите ответ в рабочее время с 10:00."
В поле Calculator введите:
response = if(time_interval('10:00','19:00'), "Менеджер скоро ответит вам", "Сейчас менеджер недоступен; вы получите ответ в рабочее время с 10:00")
В поле "Message" введите: #{response}


Пример кода для копирования
response = if(time_interval('10:00','19:00'), "Менеджер скоро ответит вам", "Сейчас менеджер недоступен; вы получите ответ в рабочее время с 10:00")
Как узнать, сколько времени осталось до дня D
Пример

Чтобы вычислить, сколько времени осталось до дня 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
Разделите на количество секунд в сутках и округлите результат:
full_days = time/86400
days = int(#{full_days})
Вычислите, сколько секунд осталось от неполных суток:
c = days*86400
d = time - c
Вычислите, скольким часам это соответствует, и округлите значение:
e = d/3600 hours = int(e)
Вычислите, сколько секунд осталось от неполных часов:
g = hours*3600
h = d - g
Переведите это в минуты и округлите значение:
i = h/60
minutes = int(i)
Вычислите, сколько секунд осталось:
k = minutes*60
seconds = h - k
И выведите время в "Message text" :
До старта осталось: #{days} дней #{hours} часов #{minutes} минут и #{seconds} секунд
Вот код, который нужно вставить в «Калькулятор» :

Текст Калькуляторе также поддерживает вычитание дат и времени без преобразования типов. Например:
'11.12.2021' - '8.12.2021' возвращает 3 (дней)
'11:12' - '3:45' возвращает 447 (минут)
Как узнать следующий день рождения
Описание
Чтобы бот отправлял поздравления с днём рождения, можно использовать функцию:
birthdate(date) - возвращает ближайший предстоящий день рождения на основе даты рождения человека: reminder = birthdate('28.04.1994')
Как получить дату определённого дня недели
Описание
Если у вас есть регулярные рассылки в определённые дни недели, можно получить дату нужного дня недели, чтобы запланировать рассылку.
weekday_date(weekday, b) - возвращает дату ближайшего указанного дня недели. Принимает два параметра:
Первый параметр — это номер дня недели, который нужно найти (от 1 до 7, где 1 = понедельник, 7 = воскресенье).
Второй параметр определяет, возвращать ли сегодняшнюю дату, если указанный день недели — сегодня. Этот параметр необязательный и по умолчанию равен False.
Рассмотрим пример, чтобы понять, как работает второй параметр:
Вы хотите запланировать отправку сообщения на четверг.
Но что если клиент зарегистрировался в четверг?
Сообщение должно быть отправлено в этот четверг или в следующий?
Второй параметр со значением False означает, что сообщение будет отправлено только в следующий четверг (сегодня пропускается).
Второй параметр со значением True означает, что сообщение будет отправлено в этот четверг, если сегодня четверг (включая день регистрации).
В нашем примере пользователь регистрируется в четверг, 13.02.2025, и мы хотим отправить сообщение в следующий четверг. Поэтому возвращаемое значение будет "20.02.2025".
Например, weekday_date(4) вернёт '20.02.2025'.
Если вы хотите, чтобы текущий день учитывался только до определённого времени, можно использовать такую конструкцию:
weekday_date(4, current_time < '13:00'), где условие можно заменить на любое нужное вам.
Вот пример использования функции:
Пример использования функции в поле "Дата отправки" соединения

Как получить дату определённого дня месяца
Описание
Если у вас есть регулярные действия в определённый день месяца, можно получить дату ближайшего такого дня, чтобы запланировать рассылку.
month_date(date, b) - возвращает ближайшую дату месяца для указанного номера дня. Принимает два параметра:
date - номер дня месяца, который нужно найти (от 1 до 31)
b - необязательный параметр; указывает, нужно ли возвращать сегодняшнюю дату, если она совпадает с указанным днём. По умолчанию False.
Если вы передадите 31, но в текущем месяце только 30 дней, функция вернёт последний день месяца (например, 30-е число).
Например:
Если сегодня 05.04.2022 и вы вызовете t = month_date(1), результат будет 01.05.2022 — ближайшее 1-е число месяца после сегодняшнего дня.
Как проверить, что текущее время попадает в рабочие часы
Описание
Например, компания работает с 9:00 до 18:00 и не работает по субботам и воскресеньям. Построим проверки по шагам:
Проверить, попадает ли время в рабочие часы: current_time >= '9:00' И current_time <= '18:00'
Проверить, находится ли время вне рабочих часов: current_time < '9:00' ИЛИ current_time > '18:00'
Проверить, является ли сегодня рабочим днём (не суббота и не воскресенье): weekday != 6 AND weekday != 7
Объединить условия для письма в рабочее время: current_time >= '9:00' И current_time <= '18:00' И weekday != 6 И weekday != 7
Объединить условия для письма вне рабочего времени: current_time < '9:00' ИЛИ current_time > '18:00' ИЛИ weekday == 6 ИЛИ weekday == 7
Как преобразовать дату и время
Пример
Используемый формат даты и времени отличается в разных системах, и возможно, один из интегрированных ресурсов вернёт время в формате, который MaviBot не распознаёт. Вам нужно будет его преобразовать.
convert_datetime(date, fin, f_out) - преобразует дату и время
Существует три параметра:
Входная строка даты
Входная строка формата
Выходная строка формата
Пример:
convert_datetime("2011-11-03", "%Y-%m-%d", "%Y/%m/%d") на выходе будет 2011/11/03
Эта функция преобразует входящую дату в timestamp.
#{current_date} #{current_time} - преобразует в "06.01.2025 11:45" — поскольку нет информации о секундах или микросекундах, у полученного timestamp после запятой будут нули.
Например: 1736144700.000000
Если добавить миллисекунды после десятичной точки,
convert_datetime("06.01.2025 19:26:35.123456", "%d.%m.%Y %H:%M:%S.%f", "%s.%f")
результат будет: 1736166395.123456
get_datetime(format) - функция для получения текущего времени в определённом формате. Функция принимает один параметр — строку, задающую нужный формат вывода.
Важно! Ответ функции будет (Monday, Tuesday и т. д.). Пример: get_datetime("%A") результатом будет Wednesday
Описание параметров строки формата, которые указываются в функции как строки в кавычках:
%a
Краткое название дня недели
Sun, Mon ...
%A
Полное название дня недели
Monday, Tuesday, …, Sunday
%w
День недели в виде десятичного числа, где 0 — воскресенье, а 6 — суббота
0, 1, …, 6
%d
День месяца в виде десятичного числа с ведущим нулём
01, 02, …, 31
%b
Краткое название месяца
Jan, Feb, …, Dec
%B
Полное название месяца
January, February, March и т. д.
%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 в виде ±HHMM[SS[.ffffff]] (пустая строка, если объект naively).
(пусто), +0000, -0400, +1030, +063415, -030712.345216
%Z
Имя часового пояса (пустая строка, если объект naively).
(пусто), 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")
Показать текущую дату в формате "дд название месяца"
Пример
Чтобы отобразить дату в формате "дд название месяца", используйте функцию current_date_eng().
Если нужно добавить к этой дате определённое количество дней, укажите нужное число дней в качестве параметра функции.
Например, если сегодня 3 апреля, то функция вернёт:
current_date_eng() - 3 апреля
current_date_eng(2) - 5 апреля
current_date_eng(-2) - 1 апреля
Последнее обновление
