使用javascript获取最后一个星期一的最佳方法是什么?我知道我可以得到这个月的最后一天,他们减去我想要的那天的天数差异。但是,有一种简短,更优雅,更有效的方法吗?
由于
答案 0 :(得分:1)
function getLastMonday(month, year) {
var d = new Date();
if (year) { d.setFullYear(year); }
d.setDate(1); // Roll to the first day of ...
d.setMonth(month || d.getMonth() + 1); // ... the next month.
do { // Roll the days backwards until Monday.
d.setDate(d.getDate() - 1);
} while (d.getDay() !== 1);
return d;
}
getLastMonday(); // => Mon Mar 25 2013 12:44:39 GMT-0600 (MDT)
getLastMonday(5); // => Mon May 27 2013 12:41:52 GMT-0600 (MDT)
getLastMonday(1, 2000); // => Mon Jan 31 2000 12:43:15 GMT-0700 (MST)
答案 1 :(得分:0)
所以,我只是意识到其他答案的问题是我的问题是错的。我想要的首先是检查某一天是否是5月的最后一个星期(或任何其他月份)。不是如何获得可能的最后一个星期一。对不起。
我相信我自己的问题的最佳答案是:
function lastMondayOfMay() {
var d = new Date(2013, 5, 0); //last day of desired month
return d.getDate() - (d.getDay() - 1);//1 here represents monday
}
对于其他月份,只需创建指向所需月份最后一天的日期。
感谢大家努力回答这个问题。但我的问题仍然存在:哪个是了解某个特定日期是否是该月的最后一个星期日的最佳方法。使用我的解决方案和他们比较日期是我目前正在做的事情。有更直接的方式吗?
我相信这也将回答我的第二个问题:
function isLastMonday(date) {//date format: 'DD/MM/YYYY'
var d = new Date(date);
return d.getDay() === 1 && (d.getDate() + 7) > 30; //1 here represents monday
}
isLastMonday('05/27/2013');//true
isLastMonday('05/26/2013');//false
isLastMonday('02/25/2013');//true
isLastMonday('03/24/2013');//false
我实际上正在测试更多的日期,它们看起来很好。任何人都可以遇到我的代码失败的情况吗?
好的,我也会回答第三个问题。这可能发生的唯一一个月是二月。这是因为我的测试失败了,最后一个星期一应该在24日之前发生。因为我只担心可能(我用它来计算阵亡将士纪念日假期),我相信我的解决方案会做。
答案 2 :(得分:0)
发布我的解决方案。我发现如果最后一天是星期天,另一个解决方案会遇到一些问题(它返回32作为上一个星期一的日期 - 见2015年5月31日星期日。
function lastMondayOfMay(year, month) {
var d = new Date(year, month, 0); //last day of desired month
if (d.getDay() == 0) {
//deals with sunday - subtracts 6 instead of adding 1
return d.getDate() - 6;
} else {
return d.getDate() - (d.getDay() - 1);
}
return d.getDate() - (d.getDay() - 1);//1 here represents monday
}
答案 3 :(得分:0)
使用没有momentjs的javascript。
/**
* @param {number} month - From 0 to 11.
* @param {number} year
*/
function lastMondayOfMonth(month, year) {
var WEEK_DAYS = 7;
var DAY_OF_WEEK = 1; // 1 for monday
var day;
var lastDateOfMonth = new Date(year, (month + 1), 0);
var lastDay = lastDateOfMonth.getDate();
var lastWeekDay = lastDateOfMonth.getDay();
if (lastWeekDay === DAY_OF_WEEK) {
day = lastDay;
} else if (lastWeekDay < DAY_OF_WEEK) {
day = lastDay - (WEEK_DAYS - DAY_OF_WEEK);
} else {
day = lastDay - (lastWeekDay) + DAY_OF_WEEK;
}
return day;
}
答案 4 :(得分:-1)
我不知道比这更短或更有效的方式(但是,我不是JavaScript大师):
var d = new Date( 2013, 5, 0 );
while( d.getDay() != 1 )
{
d.setDate( d.getDate() - 1 );
}
console.log( d.toString() );
(部分受this answer启发,评论中提及sachleen
但这基本上就是你自己提出的问题。