2010-12-10 125 views

回答

10
function (startDate, endDate, addFn, interval) { 

addFn = addFn || Date.prototype.addDays; 
interval = interval || 1; 

var retVal = []; 
var current = new Date(startDate); 

while (current <= endDate) { 
    retVal.push(new Date(current)); 
    current = addFn.call(current, interval); 
} 

return retVal; 

} 
10
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) 
+0

为了安全起见,不像上面,你应该通常选择在一天中一个时间,以避免因日光节约的细微变化。 – Phrogz 2010-12-10 22:14:22

125
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; 
} 

这里是一个功能demohttp://jsfiddle.net/jfhartsock/cM3ZU/

+1

谢谢约翰。我主要使用你的,但是你有一个byRef错误,因为currentDate不能被推到数组上,或者你最终会得到一个由n个元素组成的数组,所有这些都是最后一个日期。将其更改为currentDate = new Date(currentDate)有效。 – Scott 2010-12-10 22:46:52

+0

很高兴我能帮到你。你应该接受正确的答案。 – 2010-12-10 23:16:38

+1

编辑答案以反映Scott的更正。 – faroligo 2011-08-27 23:25:56

21

我用moment.jsTwix.js他们提供了日期和时间manpulation

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/

+1

它的工作原理,但它不是很高性能 – 2014-10-04 15:32:41

+0

我已经下载了所有与它相关的文件,但它仍然显示错误TypeError:moment.twix不是函数 – 2015-07-22 07:24:27

+0

您可能需要包含这些库。在nodejs中,var moment = require('moment');要求( 'TWIX'); – 2017-01-02 20:50:12

4

我最近与moment.js工作,下面的伎俩..

function getDateRange(startDate, endDate, dateFormat) { 
     var dates = [], 
      end = moment(endDate), 
      diff = endDate.diff(startDate, 'days'); 

     if(!startDate.isValid() || !endDate.isValid() || diff <= 0) { 
      return; 
     } 

     for(var i = 0; i < diff; i++) { 
      dates.push(end.subtract(1,'d').format(dateFormat)); 
     } 

     return dates; 
    }; 
    console.log(getDateRange(startDate, endDate, dateFormat)); 

结果将是:

["09/03/2015", "10/03/2015", "11/03/2015", "12/03/2015", "13/03/2015", "14/03/2015", "15/03/2015", "16/03/2015", "17/03/2015", "18/03/2015"] 
19

试试这个,要记住,时刻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; 
} 
+1

怎么只工作几天? – gsk 2015-07-28 11:29:07

+0

只是一个小改进:建议数组的简写符号建议'var dateArray = [] ;'Details [here](http://stackoverflow.com/questions/931872/what-s-the-difference-between-array-and-while-declaring-a-javascript-ar) – 2015-08-19 14:43:36

+0

这是新的方式 – 2015-08-20 09:21:32

6

我一直在使用@Mohammed Safeer解决方案,并进行了一些改进。使用格式化日期是在您的控制器中工作时不好的做法。 moment().format()应仅用于视图中的显示目的。另请注意,moment().clone()确保与输入参数分离,这意味着输入日期不会改变。我强烈建议您在使用日期时使用moment.js。

用法:

  • 提供moment.js日期作为值startDateendDate参数
  • interval参数是可选的,缺省值是 '天'。使用由.add()方法支持的间隔(moment.js)。 More details here
  • total以分钟为单位指定间隔时,此参数很有用。它默认为1。

调用:

var startDate = moment(), 
    endDate = moment().add(1, 'days'); 

getDatesRangeArray(startDate, endDate, 'minutes', 30); 

功能:

var getDatesRangeArray = function (startDate, endDate, interval, total) { 
    var config = { 
      interval: interval || 'days', 
      total: total || 1 
     }, 
     dateArray = [], 
     currentDate = startDate.clone(); 

    while (currentDate < endDate) { 
     dateArray.push(currentDate); 
     currentDate = currentDate.clone().add(config.total, config.interval); 
    } 

    return dateArray; 
}; 
0

这可以帮助别人,

You can get the row output from this and format the row_date object as you want.

var from_date = '2016-01-01'; 
var to_date = '2016-02-20'; 

var dates = getDates(from_date, to_date); 

console.log(dates); 

function getDates(from_date, to_date) { 
    var current_date = new Date(from_date); 
    var end_date  = new Date(to_date); 

    var getTimeDiff = Math.abs(current_date.getTime() - end_date.getTime()); 
    var date_range = Math.ceil(getTimeDiff/(1000 * 3600 * 24)) + 1 ; 

    var weekday = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]; 
    var months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"]; 
    var dates = new Array(); 

    for (var i = 0; i <= date_range; i++) { 
    var getDate, getMonth = ''; 

    if(current_date.getDate() < 10) { getDate = ('0'+ current_date.getDate());} 
    else{getDate = current_date.getDate();} 

    if(current_date.getMonth() < 9) { getMonth = ('0'+ (current_date.getMonth()+1));} 
    else{getMonth = current_date.getMonth();} 

    var row_date = {day: getDate, month: getMonth, year: current_date.getFullYear()}; 
    var fmt_date = {weekDay: weekday[current_date.getDay()], date: getDate, month: months[current_date.getMonth()]}; 
    var is_weekend = false; 
    if (current_date.getDay() == 0 || current_date.getDay() == 6) { 
     is_weekend = true; 
    } 
    dates.push({row_date: row_date, fmt_date: fmt_date, is_weekend: is_weekend}); 
    current_date.setDate(current_date.getDate() + 1); 
} 
return dates; 
} 

https://gist.github.com/pranid/3c78f36253cbbc6a41a859c5d718f362.js

1
var listDate = []; 
var startDate ='2017-02-01'; 
var endDate = '2017-02-10'; 
var dateMove = new Date(startDate); 
var strDate = startDate; 

while (strDate < endDate){ 
    var strDate = dateMove.toISOString().slice(0,10); 
    listDate.push(strDate); 
    dateMove.setDate(dateMove.getDate()+1); 
}; 
console.log(listDate); 

//["2017-02-01", "2017-02-02", "2017-02-03", "2017-02-04", "2017-02-05", "2017-02-06", "2017-02-07", "2017-02-08", "2017-02-09", "2017-02-10"] 
+0

请添加更多关于您的答案的描述和/或信息,以及它如何解决问题,以便其他人可以轻松理解而不要求澄清 – koceeng 2017-03-02 03:53:40

+0

由于某种原因,我觉得这是跳过2016-03-31! – woodhead92 2017-05-10 17:21:44

2

d3js提供了很多的方便功能,包括d3.time方便日期的操作

https://github.com/d3/d3-time

对于您的具体要求:

UTC

var range = d3.utcDay.range(new Date(), d3.utcDay.offset(new Date(), 7)); 

或本地时间

var range = d3.timeDay.range(new Date(), d3.timeDay.offset(new Date(), 7)); 

范围将是落在第一个可能的值的每一天的日期对象数组

可以更改timeDay到timeHour,timeMonth等用于在不同的时间间隔相同的结果

1

这里的如果您不想创建其他功能,则不需要任何库。用你的变量或日期值替换startDate(在两个地方)和endDate(它们是js日期对象)。当然,你可以将它包装在一个功能,如果你喜欢

Array(Math.floor((endDate - startDate)/86400000) + 1).fill().map((_, idx) => (new Date(startDate.getTime() + idx * 86400000))) 
1

我使用的是简单的while循环计算过这个问题的日期

var start = new Date("01/05/2017"); 
 
var end = new Date("06/30/2017"); 
 
var newend = end.setDate(end.getDate()+1); 
 
var end = new Date(newend); 
 
while(start < end){ 
 
    console.log(new Date(start).getTime()/1000); // unix timestamp format 
 
    console.log(start); // ISO Date format   
 
    var newDate = start.setDate(start.getDate() + 1); 
 
    start = new Date(newDate); 
 
}

1

之间刚刚来到,最简单的方法是使用时刻:

您需要先安装瞬间和瞬间范围:

const Moment = require('moment'); 
const MomentRange = require('moment-range'); 
const moment = MomentRange.extendMoment(Moment); 

const start = moment() 
const end = moment().add(2, 'months') 
const range = moment.range(start, end) 
const arrayOfDates = Array.from(range.by('days')) 
console.log(arrayOfDates) 
0

使用ES6你有Array.from意思是你可以写一个非常优雅的功能,允许动态间隔(小时,天,月)。

function getDates(startDate, endDate, interval) { 
 
const duration = endDate - startDate; 
 
const steps = duration/interval; 
 
return Array.from({length: steps+1}, (v,i) => new Date(startDate.valueOf() + (interval * i))); 
 
} 
 
const startDate = new Date(2017,12,30); 
 
const endDate = new Date(2018,1,3); 
 
const dayInterval = 1000 * 60 * 60 * 24; // 1 day 
 
const halfDayInterval = 1000 * 60 * 60 * 12; // 1/2 day 
 

 
console.log("Days", getDates(startDate, endDate, dayInterval)); 
 
console.log("Half Days", getDates(startDate, endDate, halfDayInterval));

相关问题