Javascript - 获取两个日期之间的日期列表
var range = getDates(new Date(), new Date().addDays(7));
我想将“范围”作为日期对象的数组,每天在两个日期之间进行一次。Javascript - 获取两个日期之间的日期列表
诀窍是它也应该处理月份和年份边界。
谢谢。
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;
}
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)
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;
}
我用moment.js和Twix.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/
它的工作原理,但它不是很高性能 – 2014-10-04 15:32:41
我已经下载了所有与它相关的文件,但它仍然显示错误TypeError:moment.twix不是函数 – 2015-07-22 07:24:27
您可能需要包含这些库。在nodejs中,var moment = require('moment');要求( 'TWIX'); – 2017-01-02 20:50:12
我最近与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"]
试试这个,要记住,时刻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;
}
怎么只工作几天? – gsk 2015-07-28 11:29:07
只是一个小改进:建议数组的简写符号建议'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
这是新的方式 – 2015-08-20 09:21:32
我一直在使用@Mohammed Safeer解决方案,并进行了一些改进。使用格式化日期是在您的控制器中工作时不好的做法。 moment().format()
应仅用于视图中的显示目的。另请注意,moment().clone()
确保与输入参数分离,这意味着输入日期不会改变。我强烈建议您在使用日期时使用moment.js。
用法:
- 提供moment.js日期作为值
startDate
,endDate
参数 -
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;
};
这可以帮助别人,
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
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"]
请添加更多关于您的答案的描述和/或信息,以及它如何解决问题,以便其他人可以轻松理解而不要求澄清 – koceeng 2017-03-02 03:53:40
由于某种原因,我觉得这是跳过2016-03-31! – woodhead92 2017-05-10 17:21:44
这里的如果您不想创建其他功能,则不需要任何库。用你的变量或日期值替换startDate(在两个地方)和endDate(它们是js日期对象)。当然,你可以将它包装在一个功能,如果你喜欢
Array(Math.floor((endDate - startDate)/86400000) + 1).fill().map((_, idx) => (new Date(startDate.getTime() + idx * 86400000)))
我使用的是简单的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);
}
之间刚刚来到,最简单的方法是使用时刻:
您需要先安装瞬间和瞬间范围:
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)
使用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));
为了安全起见,不像上面,你应该通常选择在一天中一个时间,以避免因日光节约的细微变化。 – Phrogz 2010-12-10 22:14:22