2010-12-10 127 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));

相關問題