使用 JavaScript 遍历日期范围

IT技术 javascript loops date iteration date-range
2021-02-21 11:31:14

给定两个Date()对象,其中一个小于另一个,我如何在日期之间每天循环?

for(loopDate = startDate; loopDate < endDate; loopDate += 1)
{

}

这种循环会起作用吗?但是如何在循环计数器中添加一天呢?

谢谢!

6个回答

这是一种方法,通过使用添加一天的方式使日期在必要时滚动到下个月,并且不会弄乱毫秒。夏令时也不是问题。

var now = new Date();
var daysOfYear = [];
for (var d = new Date(2012, 0, 1); d <= now; d.setDate(d.getDate() + 1)) {
    daysOfYear.push(new Date(d));
}

请注意,如果您想存储日期,则需要创建一个新的日期(如上使用new Date(d)),否则您将最终将每个存储的日期作为d循环中的最终值

比所有其他答案更具可读性。每个循环增加 86400000 毫秒不是很可读。
2021-04-25 11:31:14
对我来说new Date(2012, 0, 1);是错误的一天(前一天),new Date(Date.UTC(2012, 0, 1))工作正常。
2021-05-03 11:31:14
请注意夏令时。d.getDate() + 1 当 d.getDate() = GMT N 和 d.getDate() + 1 = GMT N - 1 d.getDate() + 1 两次返回一个月的同一天。
2021-05-05 11:31:14
``` d = new Date('2019-03-31') d.setDate(d.getDate() + 1) d.toISOString().slice(0, 10) // 2019-03-31 ``` ^^ 失败。
2021-05-08 11:31:14
Date.now()定义时为什么要这样做nownew Date() 默认以对象形式返回当前日期Date没有new构造函数的情况下调用只会为您提供一个 Date 字符串,然后您将其转换为 Date 对象?
2021-05-18 11:31:14

基于汤姆·古伦的回答。

var start = new Date("02/05/2013");
var end = new Date("02/10/2013");


var loop = new Date(start);
while(loop <= end){
   alert(loop);           

   var newDate = loop.setDate(loop.getDate() + 1);
   loop = new Date(newDate);
}
@DevAllanPer 没什么,Date是一个全局对象developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-05-12 11:31:14

如果您允许自己使用Moment.js,我想我找到了一个更简单的答案

// cycle through last five days, today included
// you could also cycle through any dates you want, mostly for
// making this snippet not time aware
const currentMoment = moment().subtract(4, 'days');
const endMoment = moment().add(1, 'days');
while (currentMoment.isBefore(endMoment, 'day')) {
  console.log(`Loop at ${currentMoment.format('YYYY-MM-DD')}`);
  currentMoment.add(1, 'days');
}
<script src="https://cdn.jsdelivr.net/npm/moment@2/moment.min.js"></script>

如果 startDate 和 endDate 确实是日期对象,您可以将它们转换为自 1970 年 1 月 1 日午夜以来的毫秒数,如下所示:

var startTime = startDate.getTime(), endTime = endDate.getTime();

然后你可以从一个循环到另一个循环时间增加 86400000 (1000*60*60*24) - 一天中的毫秒数:

for(loopTime = startTime; loopTime < endTime; loopTime += 86400000)
{
    var loopDay=new Date(loopTime)
    //use loopDay as you wish
}
+1,给了我足够的工作,我在我的问题中包含了工作解决方案
2021-04-27 11:31:14
当循环通过夏令时更改时(在存在问题的区域),这不起作用。否则很好的解决方案。
2021-05-04 11:31:14
你不能假设86400000一天几秒钟。这个循环对夏令时变化和其他边缘条件很脆弱。
2021-05-12 11:31:14
除了夏令时,另一个边缘条件是“闰秒”。一秒的差异确实很重要 - 转换为毫秒的日期对应于给定日期的第一秒。一秒钟的错误,你就会在前一天着陆。
2021-05-18 11:31:14

这是简单的工作代码,对我有用

var from = new Date(2012,0,1);
var to = new Date(2012,1,20);
    
// loop for every day
for (var day = from; day <= to; day.setDate(day.getDate() + 1)) {
      
   // your day is here

}