返回值应该是一个类似“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)
最佳答案
你的逻辑似乎不合适。有:
month = i.getYear(),
getYear 返回一个 2 位数的年份,将其分配给一个名为“month”的变量似乎并不明智。然后:
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) );
关于javascript - 如何仅获取两个给定日期之间该月最后一天出现在星期一的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45535712/