Как Woovi обрабатывает сложную генерацию дат с помощью Javascript

Как Woovi обрабатывает сложную генерацию дат с помощью Javascript

Содержание
  1. Сценарий
  2. Проблемы
  3. Кодекс
  4. Разбивка на этапы:
  5. Заключение

Все говорят, что данные в 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 предоставляет продавцам мгновенные платежные решения для приема заказов.