Как рассчитать количество дней до определенной даты
Кейс пригодится, если нужно проинформировать пользователя сколько дней осталось до конца акции или в других подобных случаях, когда необходимо сделать в боте счетчик дней до заданной даты.
В примере мы будем считать дни от сегодняшнего дня до даты в будущем. Этой датой, к примеру, может быть последний день скидок на покупки через бот.
При необходимости сегодняшнюю дату можно заменить на любую другую или попросить пользователя прислать дату и записать ее с помощью Ввода от пользователя с типом данных Дата. То есть на основе этого кейса можно создавать другие варианты логики, например, чтобы отсчитывались дни от даты в прошлом до сегодняшнего дня или просто вычислять количество дней между разными датами и т.д.
Суть сводится к трем действиям — сначала переводим даты в миллисекунды, делаем нужные математические вычисления, затем переводим из миллисекунд в дни, для этого будем использовать деление.
Количество дней можно доставить пользователю в рассылке или использовать любым другим образом.
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}}
В начало ↑