如何使用Moment.js排除两个日期之间的周末

tma*_*n16 30 javascript jquery momentjs

我试图在我的JavaScript代码中排除周末.我使用moment.js并且很难为'days'选择正确的变量.

到目前为止,我认为我需要通过将工作日变量更改为仅从第1天到第5天来排除第6天(星期六)和第0天(星期日).但不确定它是如何变化的.

我的jsfiddle在这里显示:FIDDLE

HTML:

<div id="myContent">
<input type="radio" value="types" class="syncTypes" name="syncTypes"> <td><label for="xshipping.xshipping1">Free Shipping: (<span id="fsv1" value="5">5</span> to <span id="fsv2" value="10">10</span> working days)</label> </td><br>
    <div id="contacts" style="display:none;border:1px #666 solid;padding:3px;top:15px;position:relative;margin-bottom:25px;">     
    Contacts
</div>
<input type="radio" value="groups" class="syncTypes" name="syncTypes"> <td><label for="xshipping.xshipping2">Express Shipping: (<span id="esv1" value="3">3</span> to <span id="esv2" value="4">4</span> working days)</label> </td>    
<div id="groups" style="display:none;border:1px #666 solid;padding:3px;top:15px;position:relative">     
    Groups
</div>
</div>
Run Code Online (Sandbox Code Playgroud)

JavaScript:

var a = 5; //Free shipping between a
var b = 10;//and b
var c = 3;//Express shipping between c
var d = 4;//and d    
var now = moment();    
var f = "Your item will be delivered between " + now.add("days",a).format("Do MMMM") + " and " + now.add("days",b).format("Do MMMM");
var g = "Your item will be delivered between " + now.add("days".c).format("Do MMMM") + " and " + now.add("days",d).format("Do MMMM");

var h = document.getElementById('contacts');
h.innerHTML = g

var i = document.getElementById('groups');
i.innerHTML = f

$(function() {
    $types = $('.syncTypes');
    $contacts = $('#contacts');
    $groups = $('#groups');
    $types.change(function() {
        $this = $(this).val();
        if ($this == "types") {
            $groups.slideUp(300);
            $contacts.delay(200).slideDown(300);
        }
        else if ($this == "groups") {
            $contacts.slideUp(300);
            $groups.delay(200).slideDown(300);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

小智 58

干得好!

function addWeekdays(date, days) {
  date = moment(date); // use a clone
  while (days > 0) {
    date = date.add(1, 'days');
    // decrease "days" only if it's a weekday.
    if (date.isoWeekday() !== 6 && date.isoWeekday() !== 7) {
      days -= 1;
    }
  }
  return date;
}
Run Code Online (Sandbox Code Playgroud)

你这样称呼它

var date = addWeekdays(moment(), 5);
Run Code Online (Sandbox Code Playgroud)

我使用.isoWeekday而不是.weekday因为它不依赖于语言环境(.weekday(0)可以是星期一或星期日).

不要减去工作日,addWeekdays(moment(), -3)否则这个简单的功能将永远循环!

更新了JSFiddle http://jsfiddle.net/Xt2e6/39/(使用不同的momentjs cdn)


小智 23

那些迭代循环解决方案不符合我的需求.它们对于大数字来说太慢了.所以我制作了自己的版本:

https://github.com/leonardosantos/momentjs-business

希望你觉得它有用.


小智 10

https://github.com/andruhon/moment-weekday-calc插件for momentJS可能对类似任务有帮助

它不能解决确切的问题,但能够计算范围内的特定工作日.

用法:

moment().isoWeekdayCalc({  
  rangeStart: '1 Apr 2015',  
  rangeEnd: '31 Mar 2016',  
  weekdays: [1,2,3,4,5], //weekdays Mon to Fri
  exclusions: ['6 Apr 2015','7 Apr 2015']  //public holidays
}) //returns 260 (260 workdays excluding two public holidays)
Run Code Online (Sandbox Code Playgroud)


Tre*_*urs 6

如果你想要一个纯 JavaScript 版本(不依赖 Moment.js),试试这个......

function addWeekdays(date, days) {
    date.setDate(date.getDate());
    var counter = 0;
        if(days > 0 ){
            while (counter < days) {
                date.setDate(date.getDate() + 1 ); // Add a day to get the date tomorrow
                var check = date.getDay(); // turns the date into a number (0 to 6)
                    if (check == 0 || check == 6) {
                        // Do nothing it's the weekend (0=Sun & 6=Sat)
                    }
                    else{
                        counter++;  // It's a weekday so increase the counter
                    }
            }
        }
    return date;
}
Run Code Online (Sandbox Code Playgroud)

你这样称呼它...

var date = addWeekdays(new Date(), 3);
Run Code Online (Sandbox Code Playgroud)

此函数检查接下来的每一天,看看它是否是星期六(第 6 天)或星期日(第 0 天)。如果为 true,则计数器不会增加,但日期会增加。此脚本适用于较小的日期增量(例如一个月或更短时间)。


Eri*_*ord 4

我建议在当前原型中添加一个函数。

也许是这样的?(未经测试)

    nextWeekday : function () {
        var day = this.clone(this);
        day = day.add('days', 1);
        while(day.weekday() == 0 || day.weekday() == 6){
          day = day.add("days", 1);              
        }
        return day;
    },
    nthWeekday : function (n) {
        var day = this.clone(this);
        for (var i=0;i<n;i++) {
          day = day.nextWeekday();
        }
        return day;
    },
Run Code Online (Sandbox Code Playgroud)

当您完成并编写一些测试后,发送拉取请求以获得奖励积分。