Javascript 生成日期对象的完整数组
问题 我正在使用Javascript 生成日期对象的完整数组,javascript,date,nvd3.js,Javascript,Date,Nvd3.js,问题 我正在使用nvd3呈现一些特定于日期的数据。但是,如果没有特定日期的数据,则不存在该日期的记录,并且nvd3不会呈现该数据点,而是在确实存在的数据点之间进行插值。因此,我需要生成缺失的日期,以便nvd3显示没有相关数据的日期 我想做什么 我需要生成一个如下所示的数组: [ {year: 2015, month: 1, day: 1}, {year: 2015, month: 1, day: 2}, ... ] function dateIntervalFormatter(from
nvd3
呈现一些特定于日期的数据。但是,如果没有特定日期的数据,则不存在该日期的记录,并且nvd3不会呈现该数据点,而是在确实存在的数据点之间进行插值。因此,我需要生成缺失的日期,以便nvd3显示没有相关数据的日期
我想做什么
我需要生成一个如下所示的数组:
[ {year: 2015, month: 1, day: 1},
{year: 2015, month: 1, day: 2},
...
]
function dateIntervalFormatter(fromDate, toDate){
var formatedInterval = [];
while(fromDate<=toDate){
formatedInterval.push({
year: fromDate.getFullYear(),
month: fromDate.getMonth(),
day: fromDate.getDate()
});
fromDate.setDate(fromDate.getDate()+1);
};
return formatedInterval;
}
生成此数组的函数将采用开始日期和结束日期,并生成这两个日期之间的所有日期
然后我将它与我的数据数组合并。这样,有数据的日期将有数据,没有数据的日期仍将显示在图表上,而不会跳过任何缺失的日期
有没有一种简单的方法可以使用
Date
对象执行此操作?也就是说,在生成这个数组时,我需要知道哪些月份有30天或31天,二月是特殊的,闰年等等。。。我可以通过指定每个月的天数来强制执行,但我想知道是否有更简单的方法来执行此操作。您不必知道特定月份的天数
var date = new Date(2016, 0, 31);
console.log(date); // Sun Jan 31 2016 00:00:00 GMT-0600 (Central Standard Time)
date.setDate(date.getDate() + 1);
console.log(date); // Mon Feb 01 2016 00:00:00 GMT-0600 (Central Standard Time)
您可以迭代一个日期
,直到您想要到达终点
见这个问题:
编辑 我感觉很糟糕,因为我没有包含一个实现,所以这里是我的方法,这与我的方法稍有相似,只是它使用了数组构造函数,而不是数组构造函数,它可以防止jslint抱怨,并返回一个
Date
对象,而不是一个对象文本<代码>字符串。重复()
印刷品:
[ Mon Feb 01 2016 18:24:29 GMT-0600 (Central Standard Time),
Tue Feb 02 2016 18:24:29 GMT-0600 (Central Standard Time),
Wed Feb 03 2016 18:24:29 GMT-0600 (Central Standard Time),
Thu Feb 04 2016 18:24:29 GMT-0600 (Central Standard Time),
Fri Feb 05 2016 18:24:29 GMT-0600 (Central Standard Time) ]
您可以使用模板尝试类似的操作 并将其推送到带有for循环的数组中,直到到达结束日期为止。每天循环递增。尝试以下操作:
function getDateArray(startDate, days){
return Array(days)
.fill()
.map(function(e,idx) {
var d = new Date(startDate);
d.setDate(d.getDate() + idx);
return {
year: d.getFullYear(),
month: d.getMonth() + 1,
day: d.getDate() };
}
);
}
迭代日期以自己创建范围数组并不困难。 正如zero298建议的那样,您可以轻松地使用
date.setDate(date.getDate()+1)
我创建了一个简单的示例,我认为这是一个非常直接的解决方案
function date_range(from, to) {
if (to instanceof Date === false)
to = new Date();
if (from instanceof Date === false || from > to)
from = to;
var results = [];
while (from.getTime() !== to.getTime()) {
results.push(date_to_object(from));
from.setDate(from.getDate() +1);
}
results.push(date_to_object(to));
return results;
}
function date_to_object(date) {
return {
year: date.getFullYear(),
month: date.getMonth() +1,
day: date.getDate()
};
}
您可以尝试以下方法:
[ {year: 2015, month: 1, day: 1},
{year: 2015, month: 1, day: 2},
...
]
function dateIntervalFormatter(fromDate, toDate){
var formatedInterval = [];
while(fromDate<=toDate){
formatedInterval.push({
year: fromDate.getFullYear(),
month: fromDate.getMonth(),
day: fromDate.getDate()
});
fromDate.setDate(fromDate.getDate()+1);
};
return formatedInterval;
}
函数dateIntervalFormatter(fromDate,toDate){
var formatedInterval=[];
(fromDate作为一种替代方法,您可以使用数字和字符串来完成此操作,而不需要使用日期对象。它应该更有效,但当然只有测试才能说明问题
//开始是y-m-d格式的日期字符串
函数性别(开始、计数){
var日期=[];
var d=start.split('-').map(编号);
var monthLength=[,31,28,31,30,31,31,30,31,30,31,31];
//如果年份是闰年,则返回true
函数isLeap(year){return!(year%4)和&!!(year%100)| |!(year%400)}
//添加一天到日期数组[年、月、日]
功能添加日(d){
++d[2];
//首先处理可能的闰年
如果(isLeap(d[0])&&d[1]==2&&d[2]个月长度[d[1]])){
d[2]=1;
++d[1];
}
//如果月份太大,则增加年份并重置月份
如果(d[1]>12){
d[1]=1;
++d[0];
}
返回d;
}
而(计数--){
推送({年:d[0],月:d[1],日:d[2]});
第二天(d);
}
返回日期;
}
document.write(JSON.stringify(genDates('2000-02-27',5)))
这看起来比我基于@zero298的答案正在研究的解决方案更有希望,更干净。我如何指定此函数的结束日期?编辑:哦,我必须输入我要填充的天数吗?明白了,谢谢你提供了整洁的函数。我喜欢这个,我只想指出我不认为Array.fill()
在IE中受支持。这取决于您使用的数据类型。如果您有两个日期字段,则可以使用此字段:您是否意识到新日期(startDate)
可能会根据主机系统偏移量返回开始前1天的日期?字符串“2016-02-01”将被视为UTC,因此,如果主机是UTC-0500,那么第一天的结果将是{year:2016,month:01,day:31}
。此函数非常浪费资源,它会在每次迭代时创建一个新的基准日期对象,也似乎是多余的。为什么要构建一个“undefined”数组只是为了使用map?一个简单的循环大约有相同数量的代码和(并且适用于所有浏览器,而不仅仅是现代浏览器)。非常有趣,谢谢!我现在使用的是公认的答案,但我觉得我需要的组件正在进行重构(现在相当慢),我会在讨论这个问题时再参考这个答案。@sg.cc-您可能对的结果感兴趣。谢谢您的编辑。虽然从思想上讲,我还是喜欢您的初步答案——它给了我足够的时间开始工作,而不必向我提供现成的答案。:)这里的一个条件是fromDate和toDate具有相同的时间组件,如果使用new Date()
创建fromDate,则不太可能出现这种情况。它还修改原始fromDate,这可能会对其他代码产生意外的结果。