1

使用 javascript 获得 5 月最后一个星期一的最佳方式是什么?我知道我可以得到这个月的最后一天,然后他们减去我想要的那一天的差。但是,有一种更简短、更优雅、更有效的方法吗?

谢谢

4

5 回答 5

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)
于 2013-03-19T18:43:27.583 回答
0

所以,我只是意识到其他答案的问题是我的问题是错误的。我首先想要的是检查某一天是否是五月的最后一个星期一(或任何其他月份)。不是如何得到五月的最后一个星期一。对于那个很抱歉。

我相信我自己的问题的最佳答案是这个:

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 日之前发生。由于我只担心可能(我用它来计算阵亡将士纪念日假期),我相信我的解决方案会做。

于 2013-03-19T18:56:44.527 回答
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
        }
于 2015-03-11T16:06:41.730 回答
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;
}
于 2017-12-08T22:35:22.747 回答
-1

我不知道比这更短或更有效的方法(但是,我不是 JavaScript 大师):

var d = new Date( 2013, 5, 0 );
while( d.getDay() != 1 )
{
    d.setDate( d.getDate() - 1 ); 
}
console.log( d.toString() );

(部分受到这个答案的启发, 评论中提到的sachleen

但这基本上是你在你的问题中已经提出的。

于 2013-03-19T18:32:38.940 回答