2016-12-06 10 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 

- ループ変数「D」のそれぞれの端部には、私は、追加の追加しようと1に設定力であるかの後の文「dates.push(Y +」 - 」 + m + " - " + d) "しかし、実際には非効率的なコーディングであることはわかっています。私は以下に試したことのうわさを加えました:

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

月の長さを制御する必要はありません。月オブジェクトの長さを制御する必要はありません。

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; 
} 

これは何かをお探しですか?

関連する問題