Как рассчитать количество дней до определенной даты

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

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

При необходимости сегодняшнюю дату можно заменить на любую другую или попросить пользователя прислать дату и записать ее с помощью Ввода от пользователя с типом данных Дата. То есть на основе этого кейса можно создавать другие варианты логики, например, чтобы отсчитывались дни от даты в прошлом до сегодняшнего дня или просто вычислять количество дней между разными датами и т.д.

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

Количество дней можно доставить пользователю в рассылке или использовать любым другим образом.

1. Получаем сегодняшнюю дату в миллисекундах с помощью хелпера {{now}}

2. Записываем число окончания акции с помощью Записи переменной и сразу переводим его в миллисекунды

Для этого используем хелпер

{{formatDate futureDate 'x'}}

где futureDate — дата, до которой считаются дни.

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

{{subtract futureDate today}}

где futureDate — дата, которая будет в будущем, а today — сегодняшний день.

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

4. Только что мы получили нужный нам результат — количество дней от сегодняшнего дня до даты окончания акции. Сейчас результат в миллисекундах, поэтапно переведем его в количество дней.

Здесь мы тоже будем пользоваться Записью переменной, хелперы по очереди запишем в значениях переменных, имена переменных могут быть разными, если необходимо записывать промежуточные результаты.

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

  • переведем результат в секунды, для этого разделим итог на 1000: {{divide (subtract futureDate today) 1000}}
  • затем в минуты, для этого делим то, что получилось на 60: {{divide (divide (subtract futureDate today) 1000) 60}}
  • чтобы получить часы, еще раз делим на 60 прошлый результат: {{divide (divide (divide (subtract futureDate today) 1000) 60) 60}}
  • чтобы узнать количество дней, делим все что есть на 24: {{divide (divide (divide (divide (subtract futureDate today) 1000) 60) 60) 24}}
  • округлим результат переведенный в дни с помощью хелпера floor {{floor (divide (divide (divide (divide (subtract futureDate today) 1000) 60) 60) 24)}}

Эту цепочку можно упростить, посчитав на калькуляторе один раз числовую часть — 86400000.

После того, как мы вычтем одно число из другого, останется только разделить результат в миллисекундах на это число, затем округлить.

{{divide (subtract to from) 86400000}}
{{floor (divide (subtract to from) 86400000)}}

Все вычисления также делаются через Запись переменной:

Хелпер {{#vars}} поможет справиться с этой задачей еще быстрее, для этого достаточно записать в миллисекундах обе даты, как в прошлом примере, затем вставить в текст блок #vars с переменными, куда записались числа из переменных futureDate и today.

{{#vars}}
{{var "ms" (subtract futureDate today) ~}}
{{var "sec" (divide @vars.ms 1000) ~}}
{{var "min" (divide @vars.sec 60) ~}}
{{var "h" (divide @vars.min 60) ~}}
{{var "d" (divide @vars.h 24) ~}}
{{var "diff" (floor @vars.d) ~}}
До конца акции осталось:
{{@vars.diff}} дней
{{/vars}}

В начало ↑