> For the complete documentation index, see [llms.txt](https://docs.leadconverter.su/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.leadconverter.su/primery/primery-botov/bot-dlya-schyota-raznicy-vo-vremeni.md).

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

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

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

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

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

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

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

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

Приступаем 🎓

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

![Не забывайте кликать на картинки, чтобы увеличить их и подробно всё рассмотреть](/files/yHRVntYLHXw6ZjLe9bpX)

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

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

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

![](/files/yzjoLB0CyAwwdX2VubyQ)

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

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

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

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

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

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

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

![](/files/Wvl1ywTTYPpmFnN0R0ty)

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

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

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

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

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

<div align="left"><figure><img src="/files/oG4OS1lN5hPlZzwgIK10" alt=""><figcaption></figcaption></figure></div>

<div align="left"><img src="/files/0GBbmyZBa37aozn0aXpq" alt="Смотрим результат"></div>

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

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

<div align="left"><img src="/files/m9PpFf9mojEP96xF4iio" alt=""></div>

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

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

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

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

![Как выглядит собранный бот](/files/H53nTlXSf18vTyV41roN)

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

<div align="left"><img src="/files/GpRyLVOc8z9RA4hoL064" alt=""></div>

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

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

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

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

* Чтобы узнать какой следующий год - нужно взять текущий год и прибавить к нему 1.
* Сложение дат выполняется с помощью функции [`date_calc`](/funkcii/data-i-vremya/date_calc.md).&#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="/pages/-MasAPNcg291uNezFqb4" %}
[Как задать вопрос в поддержку?](/kak-zadat-vopros-v-podderzhku.md)
{% endcontent-ref %}
