Робота з датами та часом

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' + days - додає до дати вказану кількість днів

'time' + minutes - додає до часу вказану кількість хвилин

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.

Використовуйте цю функцію в блоках як умову в "Variable to compare" полі або в калькуляторі, використовуючи 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."

У полі Калькулятор введіть:

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

І виведіть час у «Текст повідомлення» :

Час до початку: #{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'), де умову можна замінити на будь-яку потрібну вам умову.

Ось приклад використання функції:

Приклад використання функції в полі "Send date" у зв’язці

Як отримати дату певного дня місяця

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' AND current_time <= '18:00'

  2. Перевірте, чи час поза межами робочого часу: current_time < '9:00' OR current_time > '18:00'

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

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

  5. Об’єднайте умови для написання поза робочим часом: current_time < '9:00' OR current_time > '18:00' OR weekday == 6 OR 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]] (порожній рядок, якщо об’єкт naive).

(порожньо), +0000, -0400, +1030, +063415, -030712.345216

%Z

Назва часового поясу (порожній рядок, якщо об’єкт naive).

(порожньо), 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 квітня

Last updated