钉钉宜搭作为企业数字化应用搭建平台,广泛应用于审批流程、业务管理、项目协同等场景。在实际业务中,日期区间管理是非常常见的需求,例如员工请假时间、合同有效期、设备使用周期、项目排期等,都需要判断两个时间段是否存在冲突。
如果没有进行日期区间重叠校验,用户可能提交重复预约、时间冲突的申请,导致业务数据异常。因此,在钉钉宜搭中通过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两个区间不重叠的情况只有两种:
第一个区间结束时间早于第二个区间开始时间。
end1 < start2第二个区间结束时间早于第一个区间开始时间。
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;
}通过提交拦截,可以避免错误日期进入数据库。
多条数据之间的日期重叠检查
很多企业场景不仅需要检查两个日期,而是需要检查列表中的多个日期范围。
例如:
项目排期表:
| 项目 | 开始日期 | 结束日期 |
|---|---|---|
| 项目A | 8月1日 | 8月10日 |
| 项目B | 8月8日 | 8月15日 |
| 项目C | 8月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;