混淆循环时刻js中的日期

时间:2018-10-10 09:48:28

标签: javascript date momentjs

我正在编写一小段JavaScript,它将帮助我获取2个日期(包括今天)之间的值。

这是我的代码。

var beforeSevenDays = moment(Date.now() - 7 * 24 * 3600 * 1000).format('YYYY-MM-DD');
var i = 0;
for (var m = moment(beforeSevenDays); m.diff(moment(Date.now()).local('in'), 'days') <= 0; m.add(1, 'days')) {
    console.log("i: " + i + " " + m.format('YYYY-MM-DD'));
    i += 1;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

当我运行这段代码时,我得到的输出是

i: 0 2018-10-03
i: 1 2018-10-04
i: 2 2018-10-05
i: 3 2018-10-06
i: 4 2018-10-07
i: 5 2018-10-08
i: 6 2018-10-09
i: 7 2018-10-10
i: 8 2018-10-11

但是我期望的输出是

i: 0 2018-10-03
i: 1 2018-10-04
i: 2 2018-10-05
i: 3 2018-10-06
i: 4 2018-10-07
i: 5 2018-10-08
i: 6 2018-10-09
i: 7 2018-10-10

在这里,当我将查询修改为m.diff(moment(Date.now()).local('in'), 'days') < 0时,我得到的输出为

i: 0 2018-10-03
i: 1 2018-10-04
i: 2 2018-10-05
i: 3 2018-10-06
i: 4 2018-10-07
i: 5 2018-10-08
i: 6 2018-10-09

请让我知道我要去哪里哪里以及如何解决它。

3 个答案:

答案 0 :(得分:1)

代码的问题在于,您正在比较完整日期,moment(Date.now())将创建一个包含日期和时间的时刻,因此您的输出取决于执行它的时间。

我建议使用startOf('day')

  

通过将原始时刻设置为单位时间的开始来对其进行突变。

这里有一个现场样本:

var beforeSevenDays = moment().subtract(7, 'days').format('YYYY-MM-DD');
var today = moment().startOf('day');
var i = 0;
for (var m = moment(beforeSevenDays); m.diff(today, 'days') <= 0; m.add(1, 'days')) {
    console.log("i: " + i + " " + m.format('YYYY-MM-DD'));
    i += 1;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

旁注:您只需使用moment()即可获取当前日期和时间,而无需使用Date.now(),此外,您可以使用subtract()来获取7天前的数据而无需进行数学运算,最终,无需使用local()(不要与locale()融合),因为力矩是默认在本地模式下创建的。

答案 1 :(得分:1)

这里的问题是按日的diff函数在今天和明天的日期都返回0。这样,当条件小于或等于0时,它就会在for循环内显示的原因。

var moment =require('moment');

var beforeSevenDays = moment().subtract(7, 'days').format('YYYY-MM-DD');
var i = 0;

for (var m = moment(beforeSevenDays); m.diff(moment(Date.now()), 'days') <0 || m.isSame(moment(), 'day'); m.add(1, 'days')) {
    console.log("i: " + i + " " + m.format('YYYY-MM-DD'));
    i += 1;
}

您可以添加另一个条件以在同一天进行检查。

答案 2 :(得分:0)

混乱似乎源于Target "install" does not exist in the project "integration"如何构造moment的差异。 通过仅减去日期部分,它看起来像是另一天,但是您要让daysmoment日期。因此,关键时刻是找出某些时间单位的差异并将其转换为天。

如下面的代码片段所示,day diff为0,而hour diff不为0。 因此,您需要将时间固定在某个时间,例如diff

startOf('day')
var beforeSevenDays = moment(Date.now() - 7 * 24 * 3600 * 1000).format('YYYY-MM-DD');
var i = 0;
for (var m = moment(beforeSevenDays); m.diff(moment(Date.now()).local('in'), 'days') <= 0; m.add(1, 'days')) {
  console.log("diff in hours is: " + m.diff(moment(Date.now()).local('in'), 'hours'))
  console.log("diff in days is: " + m.diff(moment(Date.now()).local('in'), 'days'))
  console.log("diff in days with startOf is: " + m.diff(moment(Date.now()).startOf('day').local('in'), 'days'))
  console.log("i: " + i + " " + m.format('YYYY-MM-DD'));
  i += 1;
}