在NodeJS中循环访问日期范围

vlf7wbxs  于 2022-11-22  发布在  Node.js
关注(0)|答案(9)|浏览(149)

我想迭代一系列的日历日期,每次迭代是+1天。我会使用Java中围绕JodaTime构建的东西-NodeJS中有类似的东西吗?

eni9jsuy

eni9jsuy1#

您 可以 在 node.js 应用 程序 中 使用 moment.js

npm install moment

中 的 每 一 个
然后 , 您 可以 非常 轻松 地 执行 以下 操作 :

var moment = require('moment');

var a = moment('2013-01-01');
var b = moment('2013-06-01');

// If you want an exclusive end date (half-open interval)
for (var m = moment(a); m.isBefore(b); m.add(1, 'days')) {
  console.log(m.format('YYYY-MM-DD'));
}

// If you want an inclusive end date (fully-closed interval)
for (var m = moment(a); m.diff(b, 'days') <= 0; m.add(1, 'days')) {
  console.log(m.format('YYYY-MM-DD'));
}

格式
嗯 ... ... 这 看 起来 很 像 你 在 自己 的 答案 中 已经 写 好 的 代码 。 Moment.js 是 一 个 更 流行 的 库 , 有 很多 特性 , 但是 我 想 知道 哪 一 个 性能 更 好 ? 也许 你 可以 测试 一下 , 然后 告诉 我们 。 : )
但是 这 两 种 方法 都 不如 JodaTime 做 得 多 。 为此 , 需要 一 个 用 JavaScript 实现 TZDB 的 库 。 我 列出 了 some of those here
另外 , 注意 problems with JavaScript dates , 这 也 会 影响 NodeJS 。

mv1qrgav

mv1qrgav2#

我建议对Matt之前的响应进行更改。他的代码将导致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'));
}
epggiuax

epggiuax3#

下面是一个不使用外部库的解决方案:

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

egdjgwm8

egdjgwm84#

使用https://github.com/JerrySievert/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"));  
}
gojuced7

gojuced75#

替代方式使用moment和while循环。
如果您想要独占结束日期

let startDate = moment()
let endDate = moment().add(5, 'days')
while (endDate.isAfter(startDate)) {
    console.log(startDate.format('YYYY-MM-DD'))
    //increment by one day
   startDate = startDate.add(1, 'day')
}

如果要包含结束日期

let startDate = moment()
let endDate = moment().add(5, 'days')
while (endDate.isSameOrAfter(startDate)) {
    console.log(startDate.format('YYYY-MM-DD'))
    //increment by one day
    startDate = startDate.add(1, 'day')
}
1tu0hz3e

1tu0hz3e6#

使用Ramdadate-fns的函数方法:

R = require('ramda')
D = require('date-fns')

start = new Date('2013-01-01')
end = new Date('2013-06-01')

numDays = D.differenceInDays(end, start)
R.times(n => D.addDays(start, n), numDays)
li9yvcax

li9yvcax7#

使用momentjs和lodash范围的另一种方法:

let a = moment('2021-01-01');
let b = moment('2021-01-10');
_.range(b.diff(a, "d")).forEach((d) =>
  console.log(moment(a).add(d, "d").format("YYYY/MM/DD"))
);

如果您不想使用lodash,则可以获得如下所示的范围here

[...Array(b.diff(a, "d")).keys()].forEach((d) =>
  console.log(moment(a).add(d, "d").format("YYYY/MM/DD"))
);
4c8rllxm

4c8rllxm8#

没有moment也能做到。

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)
jfgube3f

jfgube3f9#

尽管有许多实用程序可以实现这一点,但要将它们集成到一个有用的循环中来检查数据可能会很麻烦。
这应该可以达到目的。这可能是矫枉过正,但你可以很容易地使这个更多的论点为基础。

var moment = require('moment');
var _ = require('lodash');

function(collectionsWithDateValues){
  var slots = [];
  var hours = {
    start: 7,   // 7am
    end: 21,    // 9pm
    window: 2   // How long each item should be slotted for.
  };
  var rightNow  = moment().add(0, 'days').hours(hours.start).minute(0).second(0);
  var cutoff    = moment(rightNow).add(14,'days'); // Check the next 2 weeks.
  for( rightNow ; rightNow.isBefore(cutoff) ; rightNow.add(hours.window, 'hours') ){
    // Check if we're going beyond the daily cutoff, go to the next day
    if(rightNow.isAfter(moment(rightNow).hour(hours.end))){
      rightNow.add(1, 'days').hour(hours.start);
    }
    var foundClash = false;
    _.forEach(collectionsWithDateValues,  function(item){
      // Check if the item is within now and the slotted time 
      foundClash = moment(item.date).isBetween(rightNow, moment(rightNow).add(hours.window, 'hours').subtract(1, 'minutes').seconds(59));
    });

    if(!foundClash){
      slots.push(rightNow.toString());
    }
  }
  return slots;
}

相关问题