# Бот для счёта разницы во времени

В инструкции мы покажем, как собрать простого бота, который будет отсчитывать дни до какого-то события.

Также бот может высчитать...

* ...сколько часов осталось до нового года;
* ...сколько дней прошло от вашего дня рождения;
* ...сколько времени прошло между датами.

В этих сценариях мы будем работать с функцией ["date\_diff" (разница во времени)](https://docs.leadconverter.su/funkcii/data-i-vremya/date_diff).

{% hint style="warning" %}
**Важно!**

В этом примере мы не показываем КАЖДЫЙ шаг, как в стартовом обучении, чтобы не усложнять чтение.

Поэтому, прежде чем приступить к выполнению инструкции, рекомендуем сначала изучить[ раздел Боты](https://docs.leadconverter.su/bots).&#x20;
{% endhint %}

Приступаем 🎓

[Создаём бота](https://docs.leadconverter.su/bots/sozdayom-bota), после чего пишем приветственное сообщение. Добавляем кнопки, чтобы можно было выбрать один из сценариев.

![Не забывайте кликать на картинки, чтобы увеличить их и подробно всё рассмотреть](https://1545507669-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MYOiJSIpC8f-Cm8cOEc%2Fuploads%2FI6tUQjWiicwm3umtCiKs%2Fimage.png?alt=media\&token=e52c7801-9c54-42e5-b378-70a8f7b6a554)

### Создаём сценарий «Сколько мне дней»

Чтобы узнать, сколько лет подписчику, нужно спросить дату его рождения.&#x20;

1. Далее создаём новый блок "**Сообщение**", тянем к нему связь от кнопки "**Сколько мне дней**".
2. Создаём сообщение типа "**Вопрос**" и добавляем переменную "**дата от**". В неё будет помещён введённый пользователем ответ.

![](https://1545507669-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MYOiJSIpC8f-Cm8cOEc%2Fuploads%2FF9x6vGPDOkOecX17rqjo%2Fimage.png?alt=media\&token=090839b5-72dd-4cdb-9947-ade763273623)

Отлично, теперь необходимо увериться, что пользователь действительно прислал нам дату.

Нужно создать условие и проверить, что наша переменная "**дата от**", в которой сейчас хранится ответ пользователя, соответствует нужному формату.

Для проверки формата мы будем использовать следующее регулярное выражение :point\_down:&#x20;

```
^(0?[1-9]|[12][0-9]|3[01]).(0?[1-9]|1[012]).((19|20)[0-9]{2})$
```

Оно взято [из этого списка](https://docs.leadconverter.su/regulyarnye-vyrazheniya). Регулярное выражение проверяет, является ли присланный текст датой в формате ДД.ММ.ГГГГ.&#x20;

{% hint style="info" %}
Если ваша задача отличается от примера и вам нужно проверить какой-то другой формат, напишите нам в [поддержку](https://t.me/LeadConverterSupportBot). Мы поможем вам составить иное выражение :heart:
{% endhint %}

1. Создаём блок "**Условие**", который будет проверять, что параметр "<mark style="color:orange;">дата от</mark>" соответствует регулярному выражению (регулярке). Если пользователь введёт текст в другом формате, сработает <mark style="color:red;">красный выход.</mark> Мы сообщим ему об ошибке и запросим ввести дату в правильном формате. Пока пользователь не введет корректную дату, дальше по сценарию он не пройдёт.

![](https://1545507669-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MYOiJSIpC8f-Cm8cOEc%2Fuploads%2FCtoiZoVr23y2S0C84EQm%2Fimage.png?alt=media\&token=327368d9-dceb-4b9e-9e44-e3932d73e83c)

2. Осталось реализовать последний блок, который будет считать результат и присылать его пользователю. Для этого мы будем использовать функцию [`date_diff`](https://docs.leadconverter.su/funkcii/data-i-vremya/date_diff).&#x20;

* Первым аргументом нужно написать формат, в котором будет посчитано значение. Мы хотим узнать разницу в днях, поэтому выбираем "**days**".
* Вторым аргументом нужно передать **дату рождения** пользователя.&#x20;
* Третий аргумент можно не передавать, по умолчанию сравнение будет происходить с **текущим временем**.

3. **Собираем всё** вышесказанное в одну строку и получаем:

   ```
   [date_diff]days|({дата от})[/date_diff]
   ```

   Вместо этой конструкции будет выведено количество дней между переданной и текущей датами. Добавим получившуюся строку в блок "**Сообщение**".

<div align="left"><figure><img src="https://1545507669-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MYOiJSIpC8f-Cm8cOEc%2Fuploads%2FCDTPOkNDsJBmHEFWGTZH%2Fimage.png?alt=media&#x26;token=88f9f7c3-ed9e-4496-93b7-4ceab72c1ced" alt=""><figcaption></figcaption></figure></div>

<div align="left"><img src="https://1545507669-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MYOiJSIpC8f-Cm8cOEc%2Fuploads%2Fw7ECd8JtwCvcwzfEu80i%2Fimage.png?alt=media&#x26;token=e479929a-7f72-421d-8263-b44227eb262f" alt="Смотрим результат"></div>

Всё работает, но "10031 дней" смотрится не очень красиво да и неудобно. Чтобы привести всё в опрятный вид, добавим возможность склонять даты.&#x20;

1. Вынесем расчёт дней в блок "**Действие**" для удобства работы с ним. Поместим результат расчёта в переменную "**количество дней**".&#x20;

<div align="left"><img src="https://1545507669-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MYOiJSIpC8f-Cm8cOEc%2Fuploads%2FGjFcMGMw5xZaLucxWnPE%2Fimage.png?alt=media&#x26;token=6e721dba-0c26-43ee-abe5-c3b17e314f83" alt=""></div>

Теперь мы можем использовать переменную "<mark style="color:orange;">количество дней</mark>" вместо вызова функции. Так менее громоздко, да и каждый раз пересчитывать не придётся.&#x20;

2. Также исправим вывод сообщения. Добавим функцию [`skl`](https://docs.leadconverter.su/funkcii/sklonenie-chislitelnykh). Составляем функцию, как в описании, и получаем такой результат :point\_down:

```
({количество дней}) [skl]({количество дней})|день|дня|дней[/skl]
```

3. Вставляем строку в наше сообщение.

![Как выглядит собранный бот](https://1545507669-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MYOiJSIpC8f-Cm8cOEc%2Fuploads%2FpJ6Yclawy0GKqD6KGDCx%2Fimage.png?alt=media\&token=6a71688e-95a2-4432-9d59-71cbb3995dbe)

4. Снова проверим, как работает бот.

<div align="left"><img src="https://1545507669-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MYOiJSIpC8f-Cm8cOEc%2Fuploads%2FLha1yfx6l2Gky7P0ko8c%2Fimage.png?alt=media&#x26;token=9ffa2e70-e68f-4646-a20f-1cf98efd12e9" alt=""></div>

Отлично! Всё работает. Мы закончили реализацию этой ветки бота.

### Создаём сценарий «Сколько часов до нового года»

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

Сейчас будет сложная математика уровня второго класса:

* Чтобы узнать какой следующий год - нужно взять текущий год и прибавить к нему 1.
* Сложение дат выполняется с помощью функции [`date_calc`](https://docs.leadconverter.su/funkcii/data-i-vremya/date_calc).&#x20;
* Чтобы получить первое января следующего года, нужно написать такую функцию

```
[date_calc]01.01.%Y|+1 year[/date_calc]
```

В результате мы получим дату 1-го января следующего года. Она будет иметь вид 01.01.2022 (если сейчас 2021-й год, естественно).

{% hint style="success" %}
Остались вопросы? Задайте их в нашу техподдержку!&#x20;

Мы всегда рады помочь :relaxed::point\_down:
{% endhint %}

{% content-ref url="../../kak-zadat-vopros-v-podderzhku" %}
[kak-zadat-vopros-v-podderzhku](https://docs.leadconverter.su/kak-zadat-vopros-v-podderzhku)
{% endcontent-ref %}


---

# 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.leadconverter.su/primery/primery-botov/bot-dlya-schyota-raznicy-vo-vremeni.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.
