【问题标题】:Best way to get the "last monday of may"获得“五月最后一个星期一”的最佳方式
【发布时间】:2017-12-09 06:35:22
【问题描述】:

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

谢谢

【问题讨论】:

  • @sachleen 获取每月的第一天到第四天非常容易。问题是一个月可以有四到五周。因此,一个月可以有 5 个星期一,而不是只有 4 个。我的问题只是关于这个第五个星期一。
  • 最佳答案返回一个月中的所有星期一。该链接是一种资源,而不是一个明确的解决方案。 :)
  • @sachleen 我已经知道这种方法,但是,有没有更好的解决方案?优雅的方式?
  • 实际上,这不是另一个问题的欺骗,它特定于最后一天,而不是序数。具体来说,反映了美国阵亡将士纪念日的计算,即 5 月的最后一个星期一。

标签: javascript date


【解决方案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)

【讨论】:

    【解决方案2】:

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

    我认为对我自己的问题的最佳答案是这个:

    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 月 31 日 -> 3 月 3 日。在 5 月的最后一天使用 Date(2013, 5, 0);
    • 我的错误。您可以使用Date(2013, 5, 0)Date('05/31/2013')。它也会起作用。
    【解决方案3】:

    发布我的解决方案。如果最后一天是星期日,我发现另一个解决方案存在一些问题(它返回 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
            }
    

    【讨论】:

      【解决方案4】:

      在没有 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;
      }
      

      【讨论】:

        【解决方案5】:

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

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

        (部分灵感来自this answersachleen 在 cmets 中提到)

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

        【讨论】:

        • 我可以用这个替换你的代码:var d = new Date(2013, 5, 31); console.log(d.getDate() - (d.getDay() - 1));
        • @Jr.Hames 好吧,你去吧(虽然我假设你的意思是new Date(2013, 4, 31))。我不知道你期望它变得多高效。如果您正在搜索 PHP 的 strtotime() 类型的功能,据我所知,JavaScript 不支持这种功能。 PS.:我使用new Date( 2013, 5, 0 ) 表示一种动态确定一个月的最后一天(在本例中为五月)的方法。
        • 如果该月的最后一天是星期日 (0),这会失败,对吧?至少当 5 月 31 日是星期天时,它对我来说失败了。所以我用 if (d.getDay() == 0) { return d.getDate() - 6; } else { 返回 d.getDate() - (d.getDay() - 1); }
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-21
        • 2012-04-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多