如何使用Moment.js排除两个date之间的周末
我想排除我的JavaScript代码中的周末。 我使用了moment.js,很难为'天'select正确的variables。
到目前为止,我认为我需要通过改变星期几variables来排除第6天(星期六)和第0天(星期日),以便从第1天到第5天计数。 但不知道如何改变。
我的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>
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); } }); });
干得好!
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; }
你这样称呼
var date = addWeekdays(moment(), 5);
我使用.isoWeekday
而不是.weekday
因为它不依赖于语言环境( .weekday(0)
可以是星期一或星期天)。
不要减去工作日,即addWeekdays(moment(), -3)
否则这个简单的函数将永远循环!
更新JSFiddle http://jsfiddle.net/Xt2e6/39/ (使用不同的momentjs cdn)
那些迭代循环解决scheme不适合我的需要。 他们对于大数量来说太慢了。 所以我做了我自己的版本:
https://github.com/leonardosantos/momentjs-business
希望你觉得它有用。
https://github.com/andruhon/moment-weekday-calc plugin 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)
如果你想要一个版本的@acorio的代码示例是高性能的(使用@ Isantos的优化),可以处理负数使用这个:
moment.fn.addWorkdays = function (days) { var increment = days / Math.abs(days); var date = this.clone().add(Math.floor(Math.abs(days) / 5) * 7 * increment, 'days'); var remaining = days % 5; while(remaining != 0) { date.add(increment, 'days'); if(date.isoWeekday() !== 6 && date.isoWeekday() !== 7) remaining -= increment; } return date; };
在这里看小提琴: http : //jsfiddle.net/dain/5xrr79h0/
我会build议添加一个function的时刻原型。
这样的事情可能吗? (另)
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; },
当你完成并写了一些testing,发送奖励积分拉的请求。
如果你想要一个纯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; }
你这样称呼…
var date = addWeekdays(new Date(), 3);
此function会在第二天检查是否在星期六(第6天)或星期天(第0天)出现。 如果属实,则计数器不增加,但date增加。 这个脚本对于像一个月或更less的小date增量是很好的。
我知道这个问题很早以前就发布了,但万一有人碰到这个,这里就是使用moment.js优化的解决scheme:
function getBusinessDays(startDate, endDate){ var startDateMoment = moment(startDate); var endDateMoment = moment(endDate) var days = Math.round(startDateMoment.diff(endDateMoment, 'days') - startDateMoment .diff(endDateMoment, 'days') / 7 * 2); if (endDateMoment.day() === 6) { days--; } if (startDateMoment.day() === 7) { days--; } return days; }