Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.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

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_Google Sheets - Fatal编程技术网

Javascript数组提供两个日期范围之间的所有天/月

Javascript数组提供两个日期范围之间的所有天/月,javascript,date,google-sheets,Javascript,Date,Google Sheets,我正在尝试创建一个函数,该函数将接受三个输入变量(开始日期、结束日期、粒度),并将输出一个包含所有日期的数组。根据输入,输出将是每日或每月粒度。例如,如果我看的是2015年1月-2015年2月: 每月将为[2015-01、2015-02] 每日将为[2015-01-01,2015-01-02,2015-01-03,…,2015-02-27,2015-02-28] 我根据其他一些帖子编写了一些代码,从逻辑上讲,我觉得应该可以使用,但出于某种原因,在查看每日粒度时,每个月的回报为31天。下面的脚

我正在尝试创建一个函数,该函数将接受三个输入变量(开始日期、结束日期、粒度),并将输出一个包含所有日期的数组。根据输入,输出将是每日或每月粒度。例如,如果我看的是2015年1月-2015年2月:

  • 每月将为[2015-01、2015-02]
  • 每日将为[2015-01-01,2015-01-02,2015-01-03,…,2015-02-27,2015-02-28]
我根据其他一些帖子编写了一些代码,从逻辑上讲,我觉得应该可以使用,但出于某种原因,在查看每日粒度时,每个月的回报为31天。下面的脚本只关注每日粒度(每月将更容易做到)-有人可以看看我做错了什么,如果有更有效的方法来做到这一点吗

日期的输入格式为“yyyy-mm”

我意识到这可能是新手犯的错误,但至少我会学到:)

谢谢

function dateRange2 (startDate,endDate,granularity) {

    var dates = [];
    var d0 = startDate.split('-');
    var d1 = endDate.split('-');
    var months31 = [1,3,5,7,8,10,12];
    var months30 = [4,6,9,11];


    for (var y = d0[0]; y <= d1[0]; y++) {
        for (var m = d0[1]; m <= d1[1]; m++) {
            if (m in months31) { 
                for (var d =1;d <=31; d++) {
                    dates.push(y+"-"+m+"-"+d);
                }
            }  ///// Issue seems to be here - not switching over to next clause
            else if (m in months30) {
                for (var d =1; d <=30; d++) {
                    dates.push(y+"-"+m+"-"+d);
                }
            } else if (m=2 && y=2016) {   
                for (var d =1; d <=29; d++) {
                    dates.push(y+"-"+m+"-"+d);
                }
            } else if (m=2 && y!=2016) {   
                for (var d =1; d <=28; d++) {
                    dates.push(y+"-"+m+"-"+d);
                }
            }        
        }
    }
    return dates;
}
函数日期范围2(开始日期、结束日期、粒度){
var日期=[];
var d0=起始日期分割('-');
var d1=endDate.split('-');
变量月31=[1,3,5,7,8,10,12];
var months30=[4,6,9,11];

对于(var y=d0[0];y而不是in运算符,使用indexOf如下:

if (months31.indexOf(m) >= 0){
}
else if (months30.index(m) >= 0){
}
in运算符将返回给定值是否为对象的属性:

经过一番尝试和错误后,我找到了它——它可能不是最漂亮的代码,但它完成了任务……理想情况下,我会将每个注释行作为单独函数的一部分添加进去

我还注意到,每个案例都使用四个“if”参数,而不需要“else-if”

函数日期范围测试(开始月、开始年、结束月、结束年、粒度){
var日期=[];
var d0=[起始年,起始月];
风险值d1=[年末,月末];
//var d0=[2014,6]用于测试
//风险值d1=[2016,4]
交换机(粒度){
个案“每日”:

对于(var y= d0(0);y其他人已经显示了如何修复您的代码。回答“更有效”是困难的,因为您还没有为此提供标准。但是如果您想要具有分离关注的健壮代码,请考虑单独的函数来解析日期字符串、格式化日期和计算范围。

如果有许多不同的格式可供使用,则有许多用于解析和格式化日期的小型库非常方便,但如果没有,则应使用以下简单函数

如果文件和评论足够,请询问,我将提供更新

/*将ISO 8601格式的日期字符串解析为本地
**@param{string}s-日期字符串,如2016-04-01
**@returns{Date}如果日期无效,则返回无效日期
*/
函数parseISODate(个){
var b=s.split(/\D/);
var d=新日期(b[0],b[1]?b[1]-1:0,b[2]| | 1);
返回d&d.getMonth()==b[1]-1?d:新日期(NaN);
}
/*基于本地时间返回ISO 8601格式的日期字符串
**仅适用于正年份(即不适用-5年)
**@param{Date}Date-从中创建日期字符串的日期对象
**@返回yyyy-mm-dd格式或默认格式的{string}日期字符串
**Date.prototype.toString(即“无效日期”)
*/
功能日期(日期){
返回日期.getDate()?('000'+日期.getFullYear()).slice(-4)+'-'+
('0'+(date.getMonth()+1)).slice(-2)+'-'+
('0'+date.getDate()).slice(-2):date.toString();
}
/*生成一个ISO 8601格式的日期字符串数组
**包括开始和结束的日期范围。每个月
**或每日间隔(默认为每日)。
**@param{string}fromDate-ISO 8601格式的开始日期
**@param{string}toDate-ISO 8601格式的结束日期
**@param{boolean}每月-返回每月间隔
**@返回日期字符串的{Array}。如果是fromDate或
**toDate无效,返回值未定义。
*/
功能性别范围(从日期、到日期、每月){
var s=解析日期(fromDate);
var e=解析日期(toDate);
var日期=[];
//检查日期是否有效
如果(!s.getDate()| |!e.getDate())返回;
//如果是每月,则将开始设置为开始月的第一个月,将e设置为结束月的第一个月
如有(每月){
s、 设定日期(1);
e、 设定日期(1);
}

感谢您的回复。尝试了这个,我得到了[2016-2016-1,2016-2016-2….,2016-2016-29]一些不同的输出。即使这不起作用,我现在也会查看此功能。编辑:事实上,即使使用我的原始公式,如果输入错误的结果(即第13个月),我也会得到上述结果,因此我将进一步研究这个问题,尝试使用
.contains
而不是
.indexOf
function dateRangetest (start_month,start_year,end_month,end_year,granularity) {

var dates = [];
var d0 = [start_year,start_month];
var d1 = [end_year,end_month];

// var d0 = [2014,6]      FOR TESTING
// var d1 = [2016,4]

  switch (granularity) {
    case "Daily":
      for (var y = d0[0]; y <= d1[0]; y++) {
        if ((y == d0[0]) && (d0[0] != d1[0])) {     // if year=start_year && year != end year   ...  start from start_month and loop up to month 12
          for (var m = d0[1]; m <= 12; m++) {      
            for (var d =1;d <= monthday(m,y); d++) {
              dates.push(y+"-"+m+"-"+d)
            }
          } 
        }
        if ((y != d0[0]) && (y!= d1[0])) {         //  if year != start_year && year != end year ....  start from month 1 to month 12    - this would 2015 data in pulling Dec 2014 - April 2016
          for (var m = 1; m <= 12; m++) {      
            for (var d =1;d <= monthday(m,y); d++) {
              dates.push(y+"-"+m+"-"+d)
            }
          } 
        }
        if ((y != d0[0]) && (y == d1[0])) {       //   if year !=start_year && year = end_year   ....  start from month 1 up until end_month
          for (var m = 1; m <= d1[1]; m++) {      
            for (var d =1;d <= monthday(m,y); d++) {
              dates.push(y+"-"+m+"-"+d)
            }
          } 
        }

        if ((y == d0[0]) && (y == d1[0])) {      /// if year=start_year && year = end_year   ....  start from start_month to end_month
          for (var m = d0[1]; m <= d1[1]; m++) {      
            for (var d =1;d <= monthday(m,y); d++) {
              dates.push(y+"-"+m+"-"+d)
            }
          } 
        }
      }
      break;
    case "Monthly":
      for (var y = d0[0]; y <= d1[0]; y++) {
        if ((y == d0[0]) && (d0[0] != d1[0])) {     // if year=start_year && year != end year   ...  start from start_month and loop up to month 12
          for (var m = d0[1]; m <= 12; m++) {
            dates.push(y+"-"+m)
          }
        }
        if ((y != d0[0]) && (y!= d1[0])) {         //  if year != start_year && year != end year ....  start from month 1 to month 12    - this would 2015 data in pulling Dec 2014 - April 2016
          for (var m = 1; m <= 12; m++) {
            dates.push(y+"-"+m)
          }
        }
        if ((y != d0[0]) && (y == d1[0])) {       //   if year !=start_year && year = end_year   ....  start from month 1 up until end_month
          for (var m = 1; m <= d1[1]; m++) {
            dates.push(y+"-"+m)
          }
        }

        if ((y == d0[0]) && (y == d1[0])) {      /// if year=start_year && year = end_year   ....  start from start_month to end_month
          for (var m = d0[1]; m <= d1[1]; m++) {
            dates.push(y+"-"+m)
          }
        }
      }  
  }
  return dates
}

///  Function for Day Date Range
function monthday (month,year) {
var months31 = [1,3,5,7,8,10,12]
var months30 = [4,6,9,11]
var leapyear = [2016,2020,2024,2028,2032]

if (months31.indexOf(month) >=0){
  var result = 31}
  else if (months30.indexOf(month) >=0){
    var result = 30}
  else if (month==2 && leapyear.indexOf(year) >=0){
    var result = 29}
  else if (month==2 && year != 2016){
    var result = 28}

  return result
}