Javascript - 获取两个日期之间的日期数组

IT技术 javascript node.js date datetime date-range
2021-01-16 13:08:29
var range = getDates(new Date(), new Date().addDays(7));

我希望“范围”是一组日期对象,两个日期之间的每一天都有一个。

诀窍是它也应该处理月份和年份的界限。

6个回答
Date.prototype.addDays = function(days) {
    var date = new Date(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
}

function getDates(startDate, stopDate) {
    var dateArray = new Array();
    var currentDate = startDate;
    while (currentDate <= stopDate) {
        dateArray.push(new Date (currentDate));
        currentDate = currentDate.addDays(1);
    }
    return dateArray;
}

这是一个功能演示 http://jsfiddle.net/jfhartsock/cM3ZU/

这对未来的日期很好,但是当我在过去的日期工作时,比如 30 天之前,我应该在哪里更改上面的代码以只获取日期而不是时间。
2021-03-17 13:08:29
谢谢约翰。我主要使用你的,但你有一个 byRef 错误,因为 currentDate 不能被推送到数组上,否则你最终会得到一个包含 n 个元素的数组,全部作为最后一个日期。将其更改为 currentDate = new Date(currentDate) 有效。
2021-03-21 13:08:29
我们应该更好地从startDate和 中删除时间endDate吗?因为如果startDate的时间晚于stopDate的时间,它不会包含stopDate在结果中,对吗?
2021-03-25 13:08:29
@vaibhavkulkarni 您可以简单地反转 addays() 原型并修改 while 循环。此外,评论不是提出新问题的地方。
2021-04-01 13:08:29
@Hp93 不确定你在说什么。如果您运行我提供的小提琴,您将看到它涵盖了这种情况。
2021-04-03 13:08:29

我看了上面所有的。自己写完了。为此,您不需要 momentjs原生 for 循环就足够了并且最有意义,因为存在 for 循环来计算范围内的值。

一个班轮:

var getDaysArray = function(s,e) {for(var a=[],d=new Date(s);d<=e;d.setDate(d.getDate()+1)){ a.push(new Date(d));}return a;};

长版

var getDaysArray = function(start, end) {
    for(var arr=[],dt=new Date(start); dt<=end; dt.setDate(dt.getDate()+1)){
        arr.push(new Date(dt));
    }
    return arr;
};

列出介于两者之间的日期:

var daylist = getDaysArray(new Date("2018-05-01"),new Date("2018-07-01"));
daylist.map((v)=>v.toISOString().slice(0,10)).join("")
/*
Output: 
    "2018-05-01
    2018-05-02
    2018-05-03
    ...
    2018-06-30
    2018-07-01"
*/

从过去日期到现在的天数:

var daylist = getDaysArray(new Date("2018-05-01"),new Date());
daylist.map((v)=>v.toISOString().slice(0,10)).join("")
它会[]为你返回吗?...您必须输入日期对象比如像new Date("2021-03-01") 只是"2021-03-01"如:-)我错过了在第一
2021-03-13 13:08:29
@HamedTaheri-是的,但这可以通过将start的副本分配dt而不是start本身来解决,例如for (var arr=[], dt=new Date(start), ...). ;-)
2021-03-21 13:08:29
此函数操作源输入日期。:) 我测试过了。
2021-03-29 13:08:29
当日期跨度发生时间变化(例如从夏令时/夏令时切换到标准时间)时,这将不会按预期工作。你最终会错过最后一天。可以通过专门设置时间来防止。
2021-04-08 13:08:29
奇迹般有效!不过,我还要补充一点。dt<=enddt<=new Date(end)
2021-04-08 13:08:29

试试这个,记得包含moment js,

function getDates(startDate, stopDate) {
    var dateArray = [];
    var currentDate = moment(startDate);
    var stopDate = moment(stopDate);
    while (currentDate <= stopDate) {
        dateArray.push( moment(currentDate).format('YYYY-MM-DD') )
        currentDate = moment(currentDate).add(1, 'days');
    }
    return dateArray;
}
值得注意的是,不再推荐使用 moment.js。该项目的开发已经停止,虽然它仍将被维护,但维护人员建议寻找替代方案。
2021-03-13 13:08:29
只是一个小小的改进:推荐用于创建数组的速记符号这里var dateArray = [];详细信息
2021-03-19 13:08:29
这是定义数组的新方法,我想它更短/更干净。
2021-03-22 13:08:29
只需添加一条注释,说明当时间与日期一起指定时,这将无法正常工作。例如,getDates('2021-01-01 23:00:00','2021-01-04 22:00:00')返回["2021-01-01", "2021-01-02", "2021-01-03"],这不包括2021-01-04
2021-03-23 13:08:29
重要修复var currentDate = moment(startDate);如果您在同一个 moment.js 日期使用此方法两次,您会感到困惑为什么它只在第一次起作用。发生这种情况是因为 javascripts 通过引用传递对象,因此该函数最终使用 startDate 两次(已经发生了变化)。修补上述修复程序可确保您在函数范围内使用新的和独特的 moment js 对象。检查这个小提琴
2021-03-30 13:08:29

我使用moment.jsTwix.js它们为日期和时间操作提供了非常好的支持

var itr = moment.twix(new Date('2012-01-15'),new Date('2012-01-20')).iterate("days");
var range=[];
while(itr.hasNext()){
    range.push(itr.next().toDate())
}
console.log(range);

我在http://jsfiddle.net/Lkzg1bxb/ 上运行

我已经下载了所有与它相关的文件,但它仍然显示错误 TypeError: moment.twix is not a function
2021-03-19 13:08:29
您可能必须包含这些库。在 nodejs 中,var moment = require('moment'); 要求('twix');
2021-04-02 13:08:29
我认为你可以使用toArray()而不是简化这个iterate()moment.twix(new Date('2012-01-15'),new Date('2012-01-20')).toArray("days"); isaaccambron.com/twix.js/docs.html#toarray
2021-04-04 13:08:29
var boxingDay = new Date("12/26/2010");
var nextWeek  = boxingDay*1 + 7*24*3600*1000;

function getDates( d1, d2 ){
  var oneDay = 24*3600*1000;
  for (var d=[],ms=d1*1,last=d2*1;ms<last;ms+=oneDay){
    d.push( new Date(ms) );
  }
  return d;
}

getDates( boxingDay, nextWeek ).join("\n");
// Sun Dec 26 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Mon Dec 27 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Tue Dec 28 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Wed Dec 29 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Thu Dec 30 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Fri Dec 31 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Sat Jan 01 2011 00:00:00 GMT-0700 (Mountain Standard Time)
我希望您也将一天中的更改添加到代码中。
2021-03-28 13:08:29
为了安全起见,与上述不同,您通常应该选择一天中间的时间,以避免由于夏令时而造成轻微变化。
2021-04-01 13:08:29