Все говорят, что данные в javascript - это кошмар. Нужно ли генерировать новые даты, работать с существующими датами, выполнять миграции и т. д.
Независимо от контекста, люди сходят с ума от дат.
В Woovi есть несколько продуктов, которые работают в прямой привязке к дате.
У нас есть генерация Pix, повторение подписей, пикс в рассрочку, отправка электронных писем по расписанию, платежи по расписанию и др.
Сегодня мы поговорим о том, как вычислить промежуток между двумя датами и днями, в которые они повторяются: рекуррентность.
Давайте представим себе следующий сценарий:
Сценарий
Задав значение от 1 до 12, мы хотим генерировать даты в этом диапазоне на основе частоты. Частота будет ежемесячной, а даты должны генерироваться в тот же день, что и начальная.
Начальной датой всегда будет та, когда скрипт был запущен.
Проблемы
Если начальная дата приходится на конец месяца, возьмите ближайший предыдущий день. Если сегодня 31, а следующего дня не существует, вы должны получить 30. То же правило действует для февраля, заканчивающегося 28-го числа. То же правило действует для февраля в високосные годы.
С помощью чистого javascript можно выполнить такую генерацию. Однако гарантировать, что правило всегда будет верным, может оказаться довольно сложно.
А что, если использовать что-то готовое, и это сработает?
Поэтому мы решили использовать RRule, которая, как говорится в самой библиотеке:
“rrule.js поддерживает правила рекурренции, определенные в iCalendar RFC, с несколькими важными отличиями. Это частичный порт модуля rrule из отличной библиотеки python-dateutil. Кроме того, он поддерживает парсинг и сериализацию рекуррентных правил из естественного языка и в него.”
Кодекс
import { RRule } from 'rrule';
const recurrentNumber = 4;
const dateStart = moment(new Date()).startOf('day').toDate();
const dateEnd = moment(dateStart).add(recurrentNumber, 'month').endOf('day').toDate();
const rule = new RRule({
freq: RRule.MONTHLY,
dtstart: dateStart,
until: dateEnd,
bymonthday: -1,
});
Разбивка на этапы:
объявите начальную дату, получите конечную дату и добавьте количество месяцев, основанное на повторяющемся числе
const dateStart = moment(new Date()).startOf('day').toDate();
const dateEnd = moment(dateStart).add(recurrentNumber, 'month').endOf('day').toDate();
Затем мы вызываем rrule, передавая частоту, dtstart, until и bymonthday, что означает:
Если задано, то это должно быть либо целое число, либо массив целых чисел, означающих дни месяца, к которым нужно применить рекурсию.
и результат, имеющий дату начала 01/31/2023, таков:
// date start and date end
{
dateStart: 2023-01-30T03:00:00.000Z,
dateEnd: 2023-05-31T02:59:59.999Z
}
// array of generated date
[
2023-01-31T03:00:00.000Z,
2023-02-28T03:00:00.000Z,
2023-03-31T03:00:00.000Z,
2023-04-30T03:00:00.000Z
]
Заключение
Если вы хотите работать в стартапе на ранней стадии, это ваш шанс. Подайте заявку сегодня!
Woovi - это стартап, который позволяет покупателям платить так, как им удобно. Чтобы сделать это возможным, Woovi предоставляет продавцам мгновенные платежные решения для приема заказов.