Работа с датами и временем

circle-info

MaviBot работает со следующими форматами ДАТЫ и ВРЕМЕНИ:

для даты – "dd.mm.yyyy" для времени – "HH:MM"

Переменные

Для работы с датой и временем можно использовать следующие переменные:

current_date - текущая дата в формате dd.mm.yyyy, с учётом часового пояса проекта next_day - дата завтрашнего дня в формате dd.mm.yyyy; удобно для планирования сообщений current_time - текущее время в формате hh:mm, с учётом часового пояса проекта weekday - день недели в виде числа: понедельник = 1, вторник = 2 и т. д.

Быстрый переход к описаниям функций:

Как добавить время к времени

circle-info

Вы можете сравнивать даты и время с помощью логических операторов так же, как числа.

addYear() | addMonth() | addDays() | addMinutes()

chevron-rightОписаниеhashtag

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' + минуты - добавляет ко времени указанное количество минут

chevron-rightПримерыhashtag

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

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

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

chevron-rightПример кода для копированияhashtag

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)

Как сравнивать время

chevron-rightОписаниеhashtag

Вы можете сравнивать даты и время с помощью логических операторов так же, как числа: больше чем > , меньше чем < равно == , не равно != больше или равно >= , меньше или равно <=

Условия сравнения также можно объединять с помощью логических операторов AND и OR.

circle-exclamation

Условия сравнения вводятся в в поле "Переменная" .

Обязательно используйте задержки при указании условий сравнения в стрелке.

chevron-rightПримерhashtag

'01.09.2020' < '11.10.2020'

'11.10.2020' >= current_date

current_date == date

current_time >= '18:00'

current_time <= '21:00'

Как задать интервалы времени

chevron-rightОписаниеhashtag

Очень полезная функция для работы с интервалами времени:

time_interval('start_time', 'end_time')

Функция возвращает логическое значение True или False.

Используйте эту функцию в блоках как условие в поле "Переменная для сравнения" или в калькуляторе с помощью IF().

circle-info

Функция позволяет проверить, попадает ли текущее время в указанный интервал.

chevron-rightПримерhashtag

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}

chevron-rightПример кода для копированияhashtag

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

Как узнать, сколько времени осталось до дня D

chevron-rightПримерhashtag

Чтобы вычислить, сколько времени осталось до дня 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 (минут)

Как узнать следующий день рождения

chevron-rightОписаниеhashtag

Чтобы бот отправлял поздравления с днём рождения, можно использовать функцию:

birthdate(date) - возвращает ближайший предстоящий день рождения на основе даты рождения человека: reminder = birthdate('28.04.1994')

Как получить дату определённого дня недели

chevron-rightОписаниеhashtag

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

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'), где условие можно заменить на любое нужное вам.

Вот пример использования функции:

Пример использования функции в поле "Дата отправки" соединения

Как получить дату определённого дня месяца

chevron-rightОписаниеhashtag

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

month_date(date, b) - возвращает ближайшую дату месяца для указанного номера дня. Принимает два параметра:

date - номер дня месяца, который нужно найти (от 1 до 31)

b - необязательный параметр; указывает, нужно ли возвращать сегодняшнюю дату, если она совпадает с указанным днём. По умолчанию False.

Если вы передадите 31, но в текущем месяце только 30 дней, функция вернёт последний день месяца (например, 30-е число).

Например:

Если сегодня 05.04.2022 и вы вызовете t = month_date(1), результат будет 01.05.2022 — ближайшее 1-е число месяца после сегодняшнего дня.

Как проверить, что текущее время попадает в рабочие часы

chevron-rightОписаниеhashtag

Например, компания работает с 9:00 до 18:00 и не работает по субботам и воскресеньям. Построим проверки по шагам:

  1. Проверить, попадает ли время в рабочие часы: current_time >= '9:00' И current_time <= '18:00'

  2. Проверить, находится ли время вне рабочих часов: current_time < '9:00' ИЛИ current_time > '18:00'

  3. Проверить, является ли сегодня рабочим днём (не суббота и не воскресенье): weekday != 6 AND weekday != 7

  4. Объединить условия для письма в рабочее время: current_time >= '9:00' И current_time <= '18:00' И weekday != 6 И weekday != 7

  5. Объединить условия для письма вне рабочего времени: current_time < '9:00' ИЛИ current_time > '18:00' ИЛИ weekday == 6 ИЛИ weekday == 7

chevron-rightПримерhashtag

Как преобразовать дату и время

chevron-rightПримерhashtag

Используемый формат даты и времени отличается в разных системах, и возможно, один из интегрированных ресурсов вернёт время в формате, который 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) - функция для получения текущего времени в определённом формате. Функция принимает один параметр — строку, задающую нужный формат вывода.

circle-info

Важно! Ответ функции будет (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

Все остальные символы представляют самих себя.

circle-info

Получить текущий timestamp можно с помощью: convert_datetime("#{current_date} #{current_time}", "%d.%m.%Y %H:%M", "%s")

Показать текущую дату в формате "дд название месяца"

chevron-rightПримерhashtag

Чтобы отобразить дату в формате "дд название месяца", используйте функцию current_date_eng().

Если нужно добавить к этой дате определённое количество дней, укажите нужное число дней в качестве параметра функции.

Например, если сегодня 3 апреля, то функция вернёт:

current_date_eng() - 3 апреля

current_date_eng(2) - 5 апреля

current_date_eng(-2) - 1 апреля

Последнее обновление