使用jQuery Datepicker与Moment.js计算日期差时如何排除周末?
计算日期区间天数差时排除周末的实现方案
你当前的代码已能正常计算日期区间的总天数差,要实现排除周末的需求,核心是修改日期统计逻辑——遍历区间内的每一天,筛选出非周六、周日的日期来计数。以下是具体修改方案:
核心修改:替换日期计算函数
新增一个专门统计工作日的函数,替代原有的calculateDateDiff:
function calculateWorkDays(endDate, startDate) { if (!endDate || !startDate) return null; let workDays = 0; let currentDate = moment(startDate); const end = moment(endDate); // 遍历从起始日到结束日的每一天 while (currentDate.isSameOrBefore(end)) { // Moment.js中day()返回值:0=周日,6=周六,排除这两个值 const dayOfWeek = currentDate.day(); if (dayOfWeek !== 0 && dayOfWeek !== 6) { workDays++; } currentDate.add(1, 'day'); } return workDays; }
调整原代码中的调用逻辑
原代码里的calculateDateDiff调用需要替换为新函数,同时去掉末尾的+1(因为新函数已直接统计包含起止日的工作日数量),示例如下:
// 原代码 $numberDays.val(calculateDateDiff($toDate.val(), $(this).val())+1); // 修改后 $numberDays.val(calculateWorkDays($toDate.val(), $(this).val()));
完整修改后的代码
$(document).ready(function () { $('#datepicker1').datepicker(); $('#datepicker2').datepicker(); $('#datepicker3').datepicker(); $('#datepicker4').datepicker(); $(function() { let $fromDate = $('#fromdate'), $toDate = $('#todate'), $numberDays = $('#leavedays'), $sfromDate=$('#sfromdate'), $stoDate=$('#stodate'), $snumberDays=$('#sleavedays'); $fromDate.datepicker().on('change', function(){ $toDate.datepicker('option', 'minDate', $(this).val()); $numberDays.val(calculateWorkDays($toDate.val(), $(this).val())); }); $toDate.datepicker().on('change', function(){ $fromDate.datepicker('option', 'maxDate', $(this).val()); $numberDays.val(calculateWorkDays($(this).val(), $fromDate.val())); }); $sfromDate.datepicker().on('change', function(){ $stoDate.datepicker('option', 'minDate', $(this).val()); $snumberDays.val(calculateWorkDays($stoDate.val(), $(this).val())); }); $stoDate.datepicker().on('change', function(){ $sfromDate.datepicker('option', 'maxDate', $(this).val()); $snumberDays.val(calculateWorkDays($(this).val(), $sfromDate.val())); }); function calculateWorkDays(endDate, startDate) { if (!endDate || !startDate) return null; let workDays = 0; let currentDate = moment(startDate); const end = moment(endDate); while (currentDate.isSameOrBefore(end)) { const dayOfWeek = currentDate.day(); if (dayOfWeek !== 0 && dayOfWeek !== 6) { workDays++; } currentDate.add(1, 'day'); } return workDays; } }); });
补充说明
- 若业务需要特殊处理起止日(比如即使是周末也计入),可修改
if判断逻辑,单独对起止日期做例外判断; - 确保页面已正确引入Moment.js库,否则日期处理逻辑会失效。
内容的提问来源于stack exchange,提问作者anmk
相关产品推荐
相关产品推荐

