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

Laravel 5.8实现日期选择器onChange自动计算请假天数

实现自动计算请假天数功能

没问题,我来帮你搞定这个自动计算请假天数的需求。咱们需要调整视图和JavaScript代码,具体步骤如下:

1. 修正Blade视图的输入框ID

首先你的视图里的日期输入框没有设置id属性,导致JavaScript里的选择器找不到元素。咱们给两个日期输入框加上对应的id,同时给天数输入框也加上id方便操作:

<div class="col-sm-4">
    <div class="form-group">
        <label>Commencement Date:<span style="color:red;">*</span></label>
        <input type="date" class="form-control" placeholder="dd/mm/yyyy" name="commencement_date" id="commencement_date" value="{{old('commencement_date')}}" min="{{Carbon\Carbon::now()->firstOfYear()->format('Y-m-d')}}" max="{{Carbon\Carbon::now()->lastOfYear()->format('Y-m-d')}}">
    </div>
</div>
<div class="col-sm-4">
    <div class="form-group">
        <label>Resumption Date:<span style="color:red;">*</span></label>
        <input type="date" class="form-control" placeholder="dd/mm/yyyy" name="resumption_date" id="resumption_date" value="{{old('resumption_date')}}" min="{{Carbon\Carbon::now()->firstOfYear()->format('Y-m-d')}}" max="{{Carbon\Carbon::now()->lastOfYear()->format('Y-m-d')}}">
    </div>
</div>
<div class="col-sm-4">
    <div class="form-group">
        <label>Requested Days:</label>
        <input type="number" name="no_of_days" id="no_of_days" class="form-control" value="{{old('no_of_days')}}" style="width: 100%;" disabled>
    </div>
</div>

2. 编写日期计算的JavaScript逻辑

接下来更新你的JavaScript代码,监听两个日期输入框的变化事件,计算它们之间的自然天数差(如果需要排除周末/节假日可以额外调整),并把结果填充到no_of_days输入框里:

<script type="text/javascript">
$(document).ready(function() {
    // 初始化日期选择器(如果用的是原生date输入,这两行可以去掉,避免重复功能)
    $('#commencement_date').datetimepicker({
        format: "YYYY-MM-DD"
    });
    $('#resumption_date').datetimepicker({
        format: "YYYY-MM-DD"
    });

    // 定义计算天数的核心函数
    function calculateLeaveDays() {
        const startDate = new Date($('#commencement_date').val());
        const endDate = new Date($('#resumption_date').val());

        // 检查日期是否有效
        if (!startDate || !endDate || isNaN(startDate.getTime()) || isNaN(endDate.getTime())) {
            $('#no_of_days').val('');
            return;
        }

        // 防止结束日期早于开始日期
        if (endDate < startDate) {
            $('#no_of_days').val('0');
            // 可选:添加错误提示
            // alert('Resumption date cannot be earlier than commencement date!');
            return;
        }

        // 计算自然天数差(包含开始当天,比如1号到2号算2天)
        const timeDiff = endDate.getTime() - startDate.getTime();
        const dayDiff = Math.ceil(timeDiff / (1000 * 3600 * 24)) + 1;

        $('#no_of_days').val(dayDiff);
    }

    // 监听两个日期输入框的变化,实时计算天数
    $('#commencement_date').on('change', calculateLeaveDays);
    $('#resumption_date').on('change', calculateLeaveDays);
});
</script>

额外说明

  • 如果不需要包含开始当天(比如1号到2号算1天),只需要去掉代码里的+1即可。
  • 要是需要计算工作日(排除周六周日),可以在计算时循环遍历日期,跳过周末;如果还要排除法定节假日,需要维护一个节假日数组来做判断。
  • 原生的type="date"输入已经自带日期选择功能,如果你没用到datetimepicker插件的额外功能,可以直接删除初始化部分的代码,减少冗余。

内容的提问来源于stack exchange,提问作者mikefolu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:02:29