使用 JavaScript 循环通过日期范围

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

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


}

这种循环可行吗? 但是我怎样才能给循环计数器增加一天呢?

谢谢!

187901 次浏览

如果 startDate 和 endDate 确实是 date 对象,那么可以将它们转换为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
}

基于 Jayarjo 的回答:

var loopDate = new Date();
loopDate.setTime(datFrom.valueOf());


while (loopDate.valueOf() < datTo.valueOf() + 86400000) {


alert(loopDay);


loopDate.setTime(loopDate.valueOf() + 86400000);
}

这里有一种方法可以做到这一点: 如果需要的话,可以利用添加一天使得日期滚动到下一个月,而不用浪费毫秒。夏令时也不是问题。

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的最终值。

基于 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);
}
var start = new Date("2014-05-01"); //yyyy-mm-dd
var end = new Date("2014-05-05"); //yyyy-mm-dd


while(start <= end){


var mm = ((start.getMonth()+1)>=10)?(start.getMonth()+1):'0'+(start.getMonth()+1);
var dd = ((start.getDate())>=10)? (start.getDate()) : '0' + (start.getDate());
var yyyy = start.getFullYear();
var date = dd+"/"+mm+"/"+yyyy; //yyyy-mm-dd


alert(date);


start = new Date(start.setDate(start.getDate() + 1)); //date increase by 1
}

根据塔巴雷的回答, 我不得不在最后再加一天,因为这个周期之前已经结束了

var start = new Date("02/05/2013");
var end = new Date("02/10/2013");
var newend = end.setDate(end.getDate()+1);
var end = new Date(newend);
while(start < end){
alert(start);


var newDate = start.setDate(start.getDate() + 1);
start = new Date(newDate);
}

在这里简单的工作代码,为我工作

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


}

我想我找到了一个更简单的答案,如果你允许自己使用 等一下:

// 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>

如果你想要一个毫秒的有效方法:

var daysOfYear = [];
for (var d = begin; d <= end; d = d + 86400000) {
daysOfYear.push(new Date(d));
}

假设您从 UI 获得了开始日期和结束日期,并将其存储在控制器中的 scope 变量中。

然后声明一个数组,该数组将在每次函数调用时重置,以便在下次函数调用时可以存储新数据。

Var dayLabel = [] ;

记住使用 New Date (您的起始变量),因为如果你没有使用新的日期,而是直接把它赋给变量,setDate 函数会在每次迭代中改变原始的变量值

for (var d = new Date($scope.startDate); d <= $scope.endDate; d.setDate(d.getDate() + 1)) {
dayLabel.push(new Date(d));
}

作为一个功能,

function getDatesFromDateRange(from, to) {
const dates = [];
for (let date = from; date <= to; date.setDate(date.getDate() + 1)) {
const cloned = new Date(date.valueOf());
dates.push(cloned);
}
return dates;
}


const start = new Date(2019, 11, 31);
const end = new Date(2020, 1, 1);


const datesArray = getDatesFromDateRange(start, end);
console.dir(datesArray);

不想将结果存储在数组中,所以可以使用屈服值?

/**
* @param {object} params
* @param {Date} params.from
* @param {Date} params.to
* @param {number | undefined} params.incrementBy
* @yields {Date}
*/
function* iterateDate(params) {
const increaseBy = Math.abs(params.incrementBy ?? 1);
for(let current = params.from; current.getTime() <= params.to.getTime(); current.setDate(current.getDate() + increaseBy)) {
yield new Date(current);
}
}


for (const d of iterateDate({from: new Date(2021,0,1), to: new Date(2021,0,31), incrementBy: 1})) {
console.log(d.toISOString());
}