【问题标题】:Get previous business day with moment.js使用 moment.js 获取前一个工作日
【发布时间】:2026-01-30 23:00:01
【问题描述】:

使用moment.js 获取前一个工作日日期的最佳方式是什么?工作日是周一到周五。

一些期望:

  • 如果今天是星期六、星期日或星期一,则返回上星期五的日期
  • 如果今天是星期二,则返回上星期一的日期(昨天)

【问题讨论】:

    标签: javascript momentjs


    【解决方案1】:
    function getPreviousWorkday(){
      let workday = moment();
      let day = workday.day();
      let diff = 1;  // returns yesterday
      if (day == 0 || day == 1){  // is Sunday or Monday
        diff = day + 2;  // returns Friday
      }
      return workday.subtract(diff, 'days');
    }
    

    【讨论】:

      【解决方案2】:

      更新方法(不循环)

      您实际上可以利用 day() 函数,该函数允许您在 moment.js 中设置当前星期几,以根据特定日期查找上一个星期五:

      function getPreviousWorkday(){
        // Based on the current day, handle accordingly
        switch(moment().day())
        {
            // If it is Monday (1),Saturday(6), or Sunday (0), Get the previous Friday (5)
            // and ensure we are on the previous week
            case 0:
            case 1:
            case 6:
              return moment().subtract(6,'days').day(5);
            // If it any other weekend, just return the previous day
            default:
              return moment().day(today - 1);
        }
      }
      

      其中can be seen here 如下所示:

      循环方法

      您可以通过 subtract() 函数从当前日期简单地从当前时刻实例中减去天数,直到您到达非周末日期:

      function getPreviousWorkday(){
        // Get today
        var today = new moment().subtract(-1,'days');;
        // If today isn't a weekend, continue iterating back until you hit a non-weekend
        while([0,6].indexOf(today.day()) !== -1){
          today = today.subtract(1, 'days');
        }
        // Return the non-weekend day
        return today;
      }
      

      您可以see an example of this in action here并在下面演示:

      【讨论】:

      • 今天未定义
      【解决方案3】:

      有一个 npm 模块!

      https://github.com/kalmecak/moment-business-days

      来自文档:

      prevBusinessDay() :将以前的营业日期作为时刻日期对象检索:

      //Previous busines day of Monday 02-02-2015
      moment('02-02-2015', 'DD-MM-YYYY').prevBusinessDay()._d // Fri Jan 30 2015 00:00:00 GMT-0600 (CST)
      
      //Previous busines day of Tuesday 03-02-2015
      moment('03-02-2015', 'DD-MM-YYYY').prevBusinessDay()._d //Mon Feb 02 2015 00:00:00 GMT-0600 (CST)
      

      P.S:重要节点。 为什么要使用依赖?如果您只需要前一个工作日 - 没有理由使用 3-d 派对库。但对于实际应用,所有这些东西对于更复杂的操作(例如导入日期、格式化和基于日历、假期等的计算)都会很有用。

      【讨论】:

        【解决方案4】:
        function getPreviousWorkday() {
          return [1, 2, 3, 4, 5].indexOf(moment().subtract(1, 'day').day()) > -1 ? 
            moment().subtract(1, 'day') : moment(moment().day(-2));
        }
        

        如果前一天是工作日,则返回前一天/工作日。否则返回上一个星期五,因为如果前一天是星期六或星期日,它应该返回上一个星期五。

        【讨论】: