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

{% hint style="info" %}
MaviBot работает со следующими форматами ДАТЫ и ВРЕМЕНИ:

для даты – **"dd.mm.yyyy"**\
для времени – **"HH:MM"**
{% endhint %}

### Переменные

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

**current\_date** - текущая дата в формате dd.mm.yyyy, с учётом часового пояса проекта\
**next\_day** - дата завтрашнего дня в формате dd.mm.yyyy; удобно для планирования сообщений\
**current\_time** - текущее время в формате hh:mm, с учётом часового пояса проекта\
**weekday** - день недели в виде числа: понедельник = 1, вторник = 2 и т. д.

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

* [Добавить время к времени](#how-to-add-time-to-time)&#x20;
* [Сравнить время](#how-to-compare-time)&#x20;
* [Задать интервалы времени](#how-to-set-time-intervals)&#x20;
* [Рассчитать время до дня D ](#how-to-find-out-how-much-time-is-left-until-day-d)
* [Найти следующий день рождения](#how-to-find-out-the-next-birthday)&#x20;
* [Получить дату определённого дня недели ](#how-to-get-the-date-of-a-specific-weekday)
* [Получить дату определённого дня месяца](#how-to-get-the-date-of-a-specific-day-of-month)&#x20;
* [Проверить, попадает ли время в рабочие часы](#how-to-check-if-the-current-time-is-within-working-hours)

### Как добавить время к времени&#x20;

{% hint style="info" %}
Вы можете сравнивать даты и время с помощью логических операторов так же, как числа.
{% endhint %}

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

<details>

<summary>Описание</summary>

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

</details>

<details>

<summary>Примеры</summary>

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

<div data-with-frame="true"><figure><img src="/files/e0b44e3b5465be917c9b58a2c01ad7c9ce3c9f76" alt="" width="563"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/b4da93540fa5df14a32674ac68d6b80432c83a5b" alt="" width="375"><figcaption></figcaption></figure></div>

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

<div data-with-frame="true"><figure><img src="/files/51dbabb7978119372ed8c2583b079d72f8877f51" alt="" width="563"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/9b8748eff8c797021baef63f29362e0176f6a286" alt="" width="375"><figcaption></figcaption></figure></div>

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

<div data-with-frame="true"><figure><img src="/files/bc9b64edb22d62c726dbd7a222137c368cd65c85" alt="" width="375"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/aff0dde34a1890653edcb409d6e0952589f492b2" alt="" width="375"><figcaption></figcaption></figure></div>

</details>

<details>

<summary>Пример кода для копирования</summary>

`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)`

</details>

### Как сравнивать время&#x20;

<details>

<summary>Описание</summary>

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

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

{% hint style="warning" %}
**Условия сравнения должны быть логически непротиворечивыми**, то есть нельзя создавать условия вроде a == 1 и a != 1, поскольку значение не может одновременно быть равно и не равно 1.
{% endhint %}

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

<div data-with-frame="true"><figure><img src="/files/ce806b0a0b86729f9b60bcc02a689b33ef390fff" alt="" width="563"><figcaption></figcaption></figure></div>

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

<div data-with-frame="true"><figure><img src="/files/d280db7a77d4b649cacd4eb4b15903ed588f3956" alt="" width="563"><figcaption></figcaption></figure></div>

</details>

<details>

<summary>Пример</summary>

`'01.09.2020'`` `*`< '11.10.2020'`*&#x20;

*`'11.10.2020' >=`*` ``current_date`

`current_date == date`

`current_time >= '18:00'`&#x20;

`current_time <= '21:00'`

</details>

### &#x20;Как задать интервалы времени

<details>

<summary>Описание</summary>

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

**time\_interval('start\_time', 'end\_time')**

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

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

{% hint style="info" %}
Функция позволяет проверить, попадает ли **текущее время** в указанный интервал.
{% endhint %}

</details>

<details>

<summary>Пример</summary>

`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, клиент получит:&#x20;***"Менеджер скоро ответит вам."***

В любое другое время он получит:&#x20;***"Сейчас менеджер недоступен; вы получите ответ в рабочее время с 10:00."***

В поле Calculator введите:

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

В поле "Message" введите: `#{response}`

<div data-with-frame="true"><figure><img src="/files/495d6f6ee6b9a6359d25a871fdad0b2277d7187d" alt="" width="563"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/4bcf44cd33f08b928252470fd1b444c8691dc76c" alt="" width="563"><figcaption></figcaption></figure></div>

</details>

<details>

<summary>Пример кода для копирования</summary>

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

</details>

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

<details>

<summary>Пример</summary>

<div data-with-frame="true"><figure><img src="/files/594694fe29d62ce5eab619e82e2325e4e542b99e" alt="" width="563"><figcaption></figcaption></figure></div>

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

Округлите полученные значения до целых чисел:&#x20;

`timeD = int(#{timestampD}) time0 = int(#{timestamp0})`

Вычислите разницу в секундах:

`time = timeD - time0`

Разделите на количество секунд в сутках и округлите результат:

`full_days = time/86400`&#x20;

`days = int(#{full_days})`

Вычислите, сколько секунд осталось от неполных суток:

`c = days*86400`&#x20;

`d = time - c`

Вычислите, скольким часам это соответствует, и округлите значение:

`e = d/3600 hours = int(e)`

Вычислите, сколько секунд осталось от неполных часов:

`g = hours*3600`&#x20;

`h = d - g`

Переведите это в минуты и округлите значение:&#x20;

`i = h/60`&#x20;

`minutes = int(i)`

Вычислите, сколько секунд осталось:

`k = minutes*60`&#x20;

`seconds = h - k`

И выведите время в **"Message text"** :

До старта осталось: #{days} дней #{hours} часов #{minutes} минут и #{seconds} секунд

Вот код, который нужно вставить в **«Калькулятор»** :

```
timestampD = convert_datetime("#{date_D} #{time_D}", "%d.%m.%Y %H:%M", "%s")
timestamp0 = #{timestamp}
timeD = int(#{timestampD})
time0 = int(#{timestamp0})
time = timeD - time0
full_days = time/86400
days = int(#{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
```

<figure><img src="/files/fe01fbb024a8e5e9a64da570358a9c747f919049" alt="" width="563"><figcaption></figcaption></figure>

Текст **Калькуляторе** также поддерживает вычитание дат и времени без преобразования типов. Например:

`'11.12.2021' - '8.12.2021'  возвращает 3 (дней)`

`'11:12' - '3:45'  возвращает 447 (минут)`

</details>

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

<details>

<summary>Описание</summary>

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

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

</details>

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

<details>

<summary>Описание</summary>

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

**weekday\_date(weekday, b)** - возвращает дату ближайшего указанного дня недели. Принимает **два параметра**:

**Первый параметр — это номер** дня недели, который нужно найти (от 1 до 7, где 1 = понедельник, 7 = воскресенье).

**Второй параметр** определяет, **возвращать ли сегодняшнюю дату, если указанный день недели — сегодня**. Этот параметр необязательный и по умолчанию равен False.

Рассмотрим пример, чтобы понять, как работает второй параметр:

Вы хотите запланировать отправку сообщения на четверг.

Но что если клиент зарегистрировался в четверг?

Сообщение должно быть отправлено в этот четверг или в следующий?

Второй параметр со значением False означает, что сообщение будет отправлено только в следующий четверг (сегодня пропускается).

Второй параметр со значением True означает, что сообщение будет отправлено в этот четверг, если сегодня четверг (включая день регистрации).

В нашем примере пользователь регистрируется в четверг, 13.02.2025, и мы хотим отправить сообщение в следующий четверг.&#x20;Поэтому возвращаемое значение будет "20.02.2025".

Например, `weekday_date(4)` вернёт '20.02.2025'.

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

`weekday_date(4, current_time < '13:00')`, где условие можно заменить на любое нужное вам.

<mark style="color:зелёный;">**Вот пример использования функции:**</mark>

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

<div data-with-frame="true"><figure><img src="/files/7ffa9b0e4a6cd64cff5fc54c35ba1d997364b20c" alt="" width="563"><figcaption></figcaption></figure></div>

</details>

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

<details>

<summary>Описание</summary>

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

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

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

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

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

Например:

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

</details>

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

<details>

<summary>Описание</summary>

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

1. Проверить, попадает ли время в рабочие часы: current\_time >= '9:00' **И** current\_time <= '18:00'&#x20;
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

</details>

<details>

<summary>Пример</summary>

<div data-with-frame="true"><figure><img src="/files/13f23ae5ea842303ac386163960a251c3e46e7b8" alt=""><figcaption></figcaption></figure></div>

</details>

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

<details>

<summary>Пример</summary>

Используемый формат даты и времени отличается в разных системах, и возможно, один из интегрированных ресурсов вернёт время в формате, который MaviBot не распознаёт. Вам нужно будет его преобразовать.&#x20;

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

{% hint style="info" %} <mark style="color:$primary;">Важно!</mark> Ответ функции будет (Monday, Tuesday и т. д.).\
\
Пример: <mark style="color:оранжевый;">get\_datetime("%A") результатом будет Wednesday</mark>
{% endhint %}

Описание параметров строки формата, которые указываются в функции как строки в кавычках:

<table data-header-hidden><thead><tr><th width="177.33333333333331">Директива</th><th>Значение</th><th>Пример</th></tr></thead><tbody><tr><td><code>%a</code></td><td>Краткое название дня недели</td><td>Sun, Mon ...</td></tr><tr><td><code>%A</code></td><td>Полное название дня недели</td><td>Monday, Tuesday, …, Sunday </td></tr><tr><td><code>%w</code></td><td>День недели в виде десятичного числа, где 0 — воскресенье, а 6 — суббота</td><td>0, 1, …, 6</td></tr><tr><td><code>%d</code></td><td>День месяца в виде десятичного числа с ведущим нулём</td><td>01, 02, …, 31</td></tr><tr><td><code>%b</code></td><td>Краткое название месяца</td><td>Jan, Feb, …, Dec</td></tr><tr><td><code>%B</code></td><td>Полное название месяца</td><td>January, February, March и т. д.</td></tr><tr><td><code>%m</code></td><td>Месяц в виде десятичного числа с ведущим нулём</td><td>01, 02, …, 12</td></tr><tr><td><code>%y</code></td><td>Год в виде двузначного числа</td><td>00, 01, …, 99</td></tr><tr><td><code>%Y</code></td><td>Год в виде четырёхзначного числа</td><td>0001, 0002, …, 2013, 2014, …, 9998, 9999</td></tr><tr><td><code>%H</code></td><td>Час (24-часовой формат) в виде двузначного числа с ведущим нулём</td><td>00, 01, …, 23</td></tr><tr><td><code>%I</code></td><td>Час (12-часовой формат) в виде двузначного числа с ведущим нулём</td><td>01, 02, …, 12</td></tr><tr><td><code>%p</code></td><td>Обозначение AM или PM</td><td>AM, PM (en_US);am, pm (de_DE)</td></tr><tr><td><code>%M</code></td><td>Минуты в виде двузначного числа с ведущим нулём</td><td>00, 01, …, 59</td></tr><tr><td><code>%S</code></td><td>Секунды в виде двузначного числа с ведущим нулём</td><td>00, 01, …, 59</td></tr><tr><td><code>%f</code></td><td>Микросекунды в виде шестизначного числа с ведущими нулями</td><td>000000, 000001, …, 999999</td></tr><tr><td><code>%z</code></td><td>Смещение UTC в виде <code>±HHMM[SS[.ffffff]]</code> (пустая строка, если объект naively).</td><td>(пусто), +0000, -0400, +1030, +063415, -030712.345216</td></tr><tr><td><code>%Z</code></td><td>Имя часового пояса (пустая строка, если объект naively).</td><td>(пусто), UTC, GMT</td></tr><tr><td><code>%j</code></td><td>День года в виде трёхзначного числа с ведущими нулями</td><td>001, 002, …, 366</td></tr><tr><td><code>%U</code></td><td>Номер недели в году (с воскресеньем как первым днём недели) в виде десятичного числа с ведущим нулём. Все дни нового года до первого воскресенья считаются нулевой неделей.</td><td>00, 01, …, 53</td></tr><tr><td><code>%W</code></td><td>Номер недели в году (с понедельником как первым днём недели) в виде десятичного числа. Все дни нового года до первого понедельника считаются нулевой неделей.</td><td>00, 01, …, 53</td></tr><tr><td><code>%%</code></td><td>Символ <code>'%'</code></td><td>%</td></tr><tr><td><code>%s</code></td><td>timestamp</td><td>1607926200</td></tr></tbody></table>

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

{% hint style="info" %}
Получить текущий timestamp можно с помощью: **convert\_datetime("#{current\_date} #{current\_time}", "%d.%m.%Y %H:%M", "%s")**
{% endhint %}

</details>

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

<details>

<summary>Пример</summary>

Чтобы отобразить дату в формате "дд название месяца", используйте функцию ***current\_date\_eng()***.&#x20;

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

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

current\_date\_eng() - 3 апреля

current\_date\_eng(2) - 5 апреля

current\_date\_eng(-2) - 1 апреля

</details>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.mavibot.ai/doc/ru/chatbot/functions/kalkulyator/date.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
