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

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

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

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

В этих сценариях мы будем работать с функцией ["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 %}
