You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:50:28