日期范围之间的Javascript循环

Tom*_*len 126 javascript loops date

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Dav*_*one 177

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

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));
}
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意夏令时。d.getDate() + 1 当 d.getDate() = GMT N 和 d.getDate() + 1 = GMT N - 1 d.getDate() + 1 两次返回一个月的同一天。 (3认同)

Tab*_*res 69

基于Tom Gullen的回答.

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);
}
Run Code Online (Sandbox Code Playgroud)

  • @DevAllanPer没什么,`Date`是一个全局对象https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date (3认同)

jay*_*rjo 8

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

var startTime = startDate.getTime(), endTime = endDate.getTime();
Run Code Online (Sandbox Code Playgroud)

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

for(loopTime = startTime; loopTime < endTime; loopTime += 86400000)
{
    var loopDay=new Date(loopTime)
    //use loopDay as you wish
}
Run Code Online (Sandbox Code Playgroud)

  • 循环超过夏令时变化时(在存在问题的区域),这不起作用.否则就是好方法. (5认同)
  • 你不能假设一天有'86400000`秒.这个循环对于夏令时变化和其他边缘条件是脆弱的. (2认同)
  • 除了夏令时,另一个边缘条件是"闰秒".一秒钟的差异*确实*重要 - 转换为毫秒的日期对应于给定日期的第一秒.一秒钟的错误,你在前一天登陆. (2认同)

Amr*_*him 7

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

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

}
Run Code Online (Sandbox Code Playgroud)


vvo*_*vvo 7

如果你允许自己使用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');
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdn.jsdelivr.net/npm/moment@2/moment.min.js"></script>
Run Code Online (Sandbox Code Playgroud)