Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 生成日期对象的完整数组_Javascript_Date_Nvd3.js - Fatal编程技术网

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,这可能会对其他代码产生意外的结果。