2016-12-06 22 views
0

我正在嘗試創建一個日期範圍,可以按每日或每週的粒度進行分析,並且遇到了障礙。我有一個函數,允許您輸入開始月份,開始年份,結束月份,結束年份和粒度,並根據粒度返回日期範圍。從start_date&end_date輸入創建日期列表

我能夠成功地進行日常運行的粒度這一點,但每週粒度運行時,在每1個月的新重新看一下下面的例子:

2015-11-01 2015-11-08 2015-11-15 2015-11-22 2015-11-29 2015-12-01 2015-12-08 2015-12-15 2015-12-22 2015-12-29 2016-01-01 2016-01-08 

我想它顯示爲:

2015-11-01 2015-11-08 2015-11-15 2015-11-22 2015-11-29 2015-12-06 2015-12-13 2015-12-20 2015-12-27 2016-01-03 

我明白爲什麼會這樣 - 在每一個for循環變量「d」的到底是力設置爲1。我試圖增加額外的,如果之後的語句「dates.push(Y +」 - 」 + m +「 - 」+ d)「,但我知道這是非常低效的編碼。我添加了我在下面嘗試的snippit:

if monthday(m,y) – d < 7 { 
    d = monthday(m,y) –d 
    if m = 12 { 
    m = 1 
    y = y+1 
    else { 
    m = m+1 
    } 
} 

下面複製了使用的函數。

任何洞察到我如何做到這一點將不勝感激!

/// Function to decide how many days in a month 
    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 this code is still being used in 2036 I'll eat my hat 

    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 
    } 


////Date Range - calculates # of days/weeks between 2 date ranges 

    function dateRange (start_month,start_year,end_month,end_year,granularity) { 

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

    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 "Weekly": 
     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+=7) { 
       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+=7) { 
       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+=7) { 
       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+=7) { 
       dates.push(y+"-"+m+"-"+d) 
       } 
      } 
      } 
     } 
     break; 
     } 
    return dates 
    } 

回答

0

你不需要控制月的長度,讓Date對象爲你做。

function formatDate(date) { 
    return date.getFullYear() + '-' + ('0' + (date.getMonth() + 1)).substr(-2) + '-' + ('0' + date.getDate()).substr(-2); 
} 

function dateRange (start_month,start_year,end_month,end_year,granularity) { 
    var date = new Date(start_year + '-' + start_month + '-01'); 
    var endDate = new Date(end_year + '-' + end_month + '-01'); 
    var arr = []; 

    while(date < endDate) { 
     arr.push(formatDate(date)); 
     switch (granularity) { 
      case 'Daily': 
       date.setDate(date.getDate() + 1); // date++ 
       break; 
      case 'Weekly': 
       date.setDate(date.getDate() + 7); // week++ 
       break; 
      case 'Monthly': 
       date.setMonth(date.getMonth() + 1); 
       break; 
      // ... 
     } 
    } 
    return arr; 
} 

這是您要找的東西嗎?

相關問題