var range = getDates(new Date(), new Date().addDays(7));
我想“范围”是一个日期对象的数组,一个为两个日期之间的每一天。
诀窍在于它还应该处理月份和年份的边界。
var range = getDates(new Date(), new Date().addDays(7));
我想“范围”是一个日期对象的数组,一个为两个日期之间的每一天。
诀窍在于它还应该处理月份和年份的边界。
当前回答
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/
其他回答
使用JavaScript
const getDatesBetween = (startDate, endDate, includeEndDate) => {
const dates = [];
const currentDate = startDate;
while (currentDate < endDate) {
dates.push(new Date(currentDate));
currentDate.setDate(currentDate.getDate() + 1);
}
if (includeEndDate) dates.push(endDate);
return dates;
};
使用打印稿
const getDatesBetween = (
startDate: Date,
endDate: Date,
includeEndDate?: boolean
) => {
const dates = [];
const currentDate = startDate;
while (currentDate < endDate) {
dates.push(new Date(currentDate));
currentDate.setDate(currentDate.getDate() + 1);
}
if (includeEndDate) dates.push(endDate);
return dates;
};
例子
console.log(getDatesBetween(new Date(2020, 0, 1), new Date(2020, 0, 3)));
console.log(getDatesBetween(new Date(2020, 0, 1), new Date(2020, 0, 3), true));
我在使用上面的答案时遇到了麻烦。由于当地夏令时(DST)导致时区偏移,日期范围丢失了一天。我实现了一个使用UTC日期的版本,解决了这个问题:
函数daterrange (startDate, endDate, steps = 1) { const dateArray = []; let currentDate = new Date(startDate); while (currentDate <=新日期(endDate)) { dateArray。推动(新日期(currentDate)); //使用UTC日期防止时区和夏令时出现问题 currentDate.setUTCDate() + steps); } 返回dateArray; } const dates = dateRange('2020-09-27', '2020-10-28'); console.log(日期);
注意:是否应用了某个时区或DST,完全取决于您的地区。忽略这一点通常不是一个好主意。使用UTC日期可以缓解大多数与时间相关的问题。
好处:您可以使用可选的steps参数设置要创建时间戳的时间间隔。如果你想要每周的时间表,将步骤设置为7。
使用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));
D3js提供了很多方便的函数,包括d3。是时候简单地处理日期了
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));
Range将是一个日期对象数组,它位于每一天的第一个可能值上
您可以将timeDay更改为timeHour, timmonth等,在不同的间隔上获得相同的结果
我一直在使用@Mohammed Safeer的解决方案一段时间,我做了一些改进。在控制器中工作时,使用格式化日期是一种糟糕的做法。Moment ().format()应该仅用于视图中的显示目的。还要记住,moment().clone()确保与输入参数分离,这意味着输入日期不会改变。我强烈建议您在处理日期时使用moment.js。
用法:
提供moment.js日期作为startDate, endDate参数的值 间隔参数为可选参数,默认为“days”。使用.add()方法(moment.js)支持的间隔。详情请点击这里 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;
};