钉钉宜搭中日期区间重叠校验的JavaScript实现

2026-09-06 13:58:21 0 次阅读

钉钉宜搭作为企业数字化应用搭建平台,广泛应用于审批流程、业务管理、项目协同等场景。在实际业务中,日期区间管理是非常常见的需求,例如员工请假时间、合同有效期、设备使用周期、项目排期等,都需要判断两个时间段是否存在冲突。

如果没有进行日期区间重叠校验,用户可能提交重复预约、时间冲突的申请,导致业务数据异常。因此,在钉钉宜搭中通过JavaScript实现日期区间重叠校验,可以有效提升数据准确性和流程规范性。

日期区间重叠校验的业务场景

日期区间重叠判断的核心目标是:判断两个时间范围是否存在交集。

例如:

  • 项目A时间:2026-08-01 至 2026-08-10

  • 项目B时间:2026-08-05 至 2026-08-15

两个日期范围存在重叠,需要阻止提交。

再例如:

  • 合同A时间:2026-08-01 至 2026-08-10

  • 合同B时间:2026-08-11 至 2026-08-20

两个时间段连续但没有交叉,可以正常保存。

在钉钉宜搭表单设计中,通常会通过日期选择组件获取开始日期和结束日期,然后利用JavaScript校验逻辑判断是否满足业务规则。

日期区间重叠判断原理

判断两个日期区间是否冲突,可以转换为判断“不重叠”的情况。

假设:

第一个区间:

start1 - end1

第二个区间:

start2 - end2

两个区间不重叠的情况只有两种:

  1. 第一个区间结束时间早于第二个区间开始时间。

end1 < start2
  1. 第二个区间结束时间早于第一个区间开始时间。

end2 < start1

如果以上两个条件都不成立,则说明两个日期范围存在交集。

因此可以使用以下逻辑:

if (!(end1 < start2 || end2 < start1)) {
    // 日期存在重叠
}

这种方式代码简单,执行效率高,非常适合用于宜搭表单校验。

钉钉宜搭获取日期字段值

在宜搭中,通常通过表单字段编码获取数据。例如:

  • 开始日期字段:startDate

  • 结束日期字段:endDate

可以通过宜搭提供的表单事件监听方法获取字段值。

示例:

let startDate = this.$("startDate").getValue();
let endDate = this.$("endDate").getValue();

获取后的日期通常为字符串格式,需要转换为JavaScript Date对象进行比较。

JavaScript实现日期区间重叠校验

下面是一个通用的日期区间校验方法:

function checkDateOverlap(start1, end1, start2, end2) {

    let dateStart1 = new Date(start1);
    let dateEnd1 = new Date(end1);
    let dateStart2 = new Date(start2);
    let dateEnd2 = new Date(end2);

    return !(dateEnd1 < dateStart2 || dateEnd2 < dateStart1);
}

调用方式:

let result = checkDateOverlap(
    "2026-08-01",
    "2026-08-10",
    "2026-08-05",
    "2026-08-15"
);

if (result) {
    console.log("日期区间存在冲突");
} else {
    console.log("日期区间不存在冲突");
}

执行结果:

日期区间存在冲突

在宜搭提交前进行日期冲突校验

实际应用中,一般会在表单提交事件中增加校验逻辑。

例如员工申请系统:

  • 入职日期

  • 离职日期

  • 请假开始时间

  • 请假结束时间

提交前检查日期是否合法。

示例:

export function beforeSubmit() {

    let startDate = this.$("startDate").getValue();
    let endDate = this.$("endDate").getValue();

    if (!startDate || !endDate) {
        this.utils.toast({
            title: "请选择完整日期范围",
            type: "warning"
        });

        return false;
    }

    let start = new Date(startDate);
    let end = new Date(endDate);

    if (start > end) {
        this.utils.toast({
            title: "开始日期不能晚于结束日期",
            type: "error"
        });

        return false;
    }

    return true;
}

通过提交拦截,可以避免错误日期进入数据库。

多条数据之间的日期重叠检查

很多企业场景不仅需要检查两个日期,而是需要检查列表中的多个日期范围。

例如:

项目排期表:

项目开始日期结束日期
项目A8月1日8月10日
项目B8月8日8月15日
项目C8月20日8月25日

需要遍历所有数据进行比较。

示例:

function hasOverlap(list) {

    for (let i = 0; i < list.length; i++) {

        for (let j = i + 1; j < list.length; j++) {

            let item1 = list[i];
            let item2 = list[j];

            let overlap =
                !(new Date(item1.end) < new Date(item2.start) ||
                new Date(item2.end) < new Date(item1.start));

            if (overlap) {
                return true;
            }
        }
    }

    return false;
}

这种方式适用于宜搭子表单数据校验。

日期比较中的常见问题

1. 日期格式导致判断错误

不同浏览器对日期字符串解析存在差异。

例如:

new Date("2026-08-01")

部分环境可能按照UTC解析,导致日期偏移。

建议统一转换格式:

new Date("2026/08/01")

或者手动处理年月日。

2. 忽略时间导致冲突判断错误

如果业务包含具体时间,例如会议预约:

2026-08-01 09:00
2026-08-01 10:00

不能只比较日期,需要精确到时间。

可以直接使用时间戳:

let timestamp = new Date(value).getTime();

时间戳比较更加可靠。

3. 开始时间和结束时间为空

用户未填写完整日期时,应提前提示:

if (!startDate || !endDate) {
    return false;