2017-08-06 156 views
1

返回值應該是像「10/31/2016 8/31/2017」之類的字符串。該函數返回一年中的所有星期一,但如果它們是該月的最後一天,我只需要每月最後一個星期一的日期。如何僅獲取星期一在兩個給定日期之間的月份的最後一天的日期

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

迭代範圍幾個月,設置日期每個月的第一天,回到哪一天'date.setDate(date.getDate() - 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(), 

得到年返回一個2位數的年份,將其分配到一個名爲「月」變量似乎並不明智。然後:

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

將增加日期,直到getDay返回2,即星期二。然後:

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

對我沒有任何意義。我想你的算法是把日期設置爲星期一,然後加上幾個星期,如果它在一個月的月底結束,保存它。但是你沒有這樣實現它。

一個更簡單且可能更快的算法是從開始到結束每個月的最後一天,如果是星期一,則將其推送到數組。有很多方法可以做到這一點,這裏有一個。

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

像這樣的東西?

- 編輯

這裏是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"

相關問題