Итерация по диапазону дат в NodeJS
Я хотел бы пройтись по диапазону календарных дат, увеличивая дату на один день в каждой итерации. Я использовал что-то, основанное на JodaTime в Java. Есть ли что-то похожее в Node.js?
4 ответ(ов)
Я бы хотел предложить изменение к раннему ответу от Мэтта. Его код приведет к мутации объекта a
. Попробуйте это...
var moment = require('moment');
var a = moment('2013-01-01');
var b = moment('2013-06-01');
for (var m = moment(a); m.isBefore(b); m.add(1, 'days')) {
console.log(m.format('YYYY-MM-DD'));
}
В этом коде используется метод moment(a)
для создания нового объекта, который не изменяет исходный объект a
. Таким образом, вы избегаете побочных эффектов и мутации объекта времени.
Вот одно из решений без использования внешних библиотек:
var start = new Date('October 1, 2020 03:00:00Z');
var now = new Date();
for (var d = start; d < now; d.setDate(d.getDate() + 1)) {
console.log(d);
}
Результат:
2020-10-01T03:00:00.000Z
2020-10-02T03:00:00.000Z
2020-10-03T03:00:00.000Z
2020-10-04T03:00:00.000Z
2020-10-05T03:00:00.000Z
2020-10-06T03:00:00.000Z
Обратите внимание, что Z
в конце первой даты обозначает UTC. Если вам нужно указать ваше временное пояснение, просто уберите букву Z
.
Чтобы использовать библиотеку node-date-utils и легко перебирать даты, вы можете сделать это следующим образом:
require('date-utils');
var d = new Date('2013-01-01');
var e = new Date('2013-06-01');
for(var i = d; i.isBefore(e); i.addDays(1)) {
console.log(i.toFormat("YYYY-MM-DD"));
}
В данном примере мы создаем два объекта Date
— d
и e
, представляющие начальную и конечную дату соответственно. Затем с помощью цикла for
перебираем каждую дату с шагом в один день, используя метод addDays(1)
, пока текущая дата не станет равной или не превысит конечную дату e
. Внутри цикла мы выводим каждую дату в формате "YYYY-MM-DD" с помощью метода toFormat
.
Такой подход позволяет удобно работать с датами и делает код более читаемым.
Вы можете обойтись без использования библиотеки moment
, используя встроенные функции JavaScript для работы с датами. Вот как это можно сделать:
Первый способ — это просто использовать цикл for
, чтобы итерировать по датам. Например, чтобы вывести все даты с 1 ноября 2022 года по 30 ноября 2022 года, вы можете сделать это следующим образом:
for (const date = new Date(2022, 10, 1); date < new Date(2022, 11, 1); date.setDate(date.getDate() + 1)) {
console.log(date)
}
Но также вы можете создать функции для более удобной работы с датами. Вот пример из двух функций: одна для добавления дней к дате, а другая для итерации по диапазону дат:
export function addDate(date: Date, value = 1) {
const newDate = new Date(date)
newDate.setDate(newDate.getDate() + value)
return newDate
}
export function* iterateDate(startDate: Date, endDate: Date) {
for (let date = startDate; date <= endDate; date = addDate(date))
yield date
}
Теперь вы можете использовать эту функцию итерации так:
for (const date of iterateDate(new Date('2022-10-01'), new Date()))
console.log(date)
Это удобный способ итерировать по датам без дополнительных библиотек, используя только возможности JavaScript.
Сравнение двух дат в JavaScript
Как вернуть только дату из типа данных DateTime в SQL Server
Как рассчитать количество дней между двумя заданными датами
Создание диапазона дат в Python
Получить дату в текущем часовом поясе на Java