2017-08-06 18 views
1

戻り値は、 "10/31/2016 8/31/2017"のような文字列でなければなりません。この関数は、月のすべての月を返しますが、月の最後の日であれば、毎月最後の月曜日の日付が必要です。月の最後の日が月曜日の2つの指定された日付の間に来る日付を取得する方法

function getMondays(startYear, endYear) { 
    const startDate = new Date(startYear, 0, 2) 
    const endDate = new Date(endYear, 11, 32) 

    var i = startDate, 
    month = i.getYear(), 
    mondaysOfYear = [] 

    while (i.getDay() !== 2) { 
    i.setDate(i.getDate() + 1) 
    } 

    while (i.getYear() === month) { 
    mondaysOfYear.push(new Date(i.getTime())) 
    i.setDate(i.getDate() + 7) 
    } 
    return mondaysOfYear 
} 
getMondays(2017, 2017) 
+0

反復、毎月1日に設定されている日付は、' date.setDateは1日戻って'date.getDay()=== 2' – pawel

+0

startYearが2017の場合、10/31/2016を取得する – Slai

+0

なぜ' endDate = new Date(endYear、11,32) 'ですか?それは翌年1月1日になります。 – RobG

答えて

1
ここ

を編集

あなたのロジックは適切ではないようです。あり:

month = i.getYear(), 

getYearメソッドが賢明なようではありません「月」と呼ばれる変数に代入、2桁の年を返します。次に:

while (i.getDay() !== 2) { 
    i.setDate(i.getDate() + 1) 
} 

getDayが火曜日である2を返すまで日付をインクリメントします。次に:

if (i.getMonth() != prevMonth) mondaysOfYear.push(prevDate); 

私には意味がありません。あなたのアルゴリズムは月曜日に日付を設定してから週を追加し、月の終わりに終了する場合は保存していると思います。しかし、あなたはそれをそのように実装していません。

より簡単でより高速なアルゴリズムは、開始から終了までの各月の最後の日を取得し、月曜日の場合はそれを配列にプッシュすることです。これを行うには多くの方法がありますが、ここには1つあります。 `とかどうかをチェック; - (1 date.getDate())の範囲内ヶ月にわたり

function getMondays(startYear, endYear) { 
 
    // Set start to 1 Jan of start year 
 
    var start = new Date(startYear, 0); 
 
    // Set end to 31 Dec of end year 
 
    var end = new Date(endYear, 11,31); 
 
    var mondays = []; 
 
    
 
    do { 
 
    // setDate to end of month 
 
    start.setMonth(start.getMonth() + 1, 0); 
 

 
    // If it's a Monday, store it in US mm/dd/yyyy format 
 
    if (start.getDay() == 1) { 
 
     mondays.push(start.toLocaleString('en-us', { 
 
     year: 'numeric', 
 
     month: '2-digit', 
 
     day: '2-digit' 
 
     })); 
 
    } 
 

 
    // Set date to start of next month 
 
    start.setDate(start.getDate() + 1); 
 
    } while (start <= end) 
 
    
 
    return mondays; 
 
} 
 

 
console.log(getMondays(2016,2017));

0

これはあなたのすべての最後の月曜日を取得します - とき月が変更

function getMondays(startYear, endYear) { 
    const startDate = new Date(startYear, 0, 2) 
    const endDate = new Date(endYear, 11, 32) 

    var i = startDate, 
    month = i.getYear(), 
    mondaysOfYear = [] 

    while (i.getDay() !== 2) { 
    i.setDate(i.getDate() + 1) 
    } 
    var prevMonth = 0; 
    var prevDate; 
    while (i.getYear() === month) { 
    if(i.getMonth()!= prevMonth) mondaysOfYear.push(prevDate); 
    prevMonth = i.getMonth(); //Retaining the last month to compare 
    prevDate = new Date(i.getTime()); //Retaining the last monday 
    i.setDate(i.getDate() + 7); 
    } 
    mondaysOfYear.push(prevDate);//for December 
    return mondaysOfYear 
} 
getMondays(2017, 2017); 

は、日付をフィルタリングします。ループの後に最後に12月の最後の月曜日を追加します。

0

これは何か?

- それはstackoverflowの上、ここで誤った結果を与えた場合にはjsfiddleへのリンクです:)

function getMondays(startYear, endYear) { 
 
    var months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; 
 
    var mondays = []; 
 
    while(startYear <= endYear) { 
 
    for(var i = 0; i < 12; i++) { 
 
     var leapYear = startYear % 4 === 0 && i === 1; 
 
     var currentDate = new Date(startYear, i, leapYear ? months[i]+1 : months[i]); 
 
     if(currentDate.getDay() === 1) 
 
     mondays.push(currentDate); 
 
    } 
 
    startYear += 1; 
 
    } 
 
    return mondays; 
 
} 
 

 
var mondays = getMondays(2016, 2017) 
 
console.log(mondays)

1

function getMondays(startYear, endYear) { 
 
    mondaysOfYear = [] 
 
    for (var y = startYear; y <= endYear; y++) 
 
    for (var m = 1; m < 13; m++) { 
 
     var d = new Date(y, m, 0); // console.log(d.toDateString()) // "Mon Jul 31 2017" 
 
     if (d.getDay() === 1) 
 
     mondaysOfYear.push(d.toLocaleDateString()) 
 
    } 
 
    return mondaysOfYear 
 
} 
 

 
console.log(getMondays(2016, 2017).join(" "))  // "2/29/2016 10/31/2016 7/31/2017"

関連する問題