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

日期时段星期重复校验需求:新增条目冲突校验实现

业务条目时间冲突校验实现方案

嘿,针对你提到的包含date from、date to、time from、time to、day字段的业务条目重复校验需求,我整理了一套清晰的落地思路,完全匹配你给出的拦截规则:

核心拦截规则先明确

只有当新增条目和已有条目同时满足以下三个条件时,才触发拦截:

  • 星期(day)完全匹配(注意大小写、空格不影响,比如Mon,Tue和Mon,tue得视为同一个星期组合)
  • 时段(time from到time to)存在重叠(包括跨天时段,比如10:00到次日5:00这种)
  • 日期区间(date from到date to)重叠或完全重复

分步实现校验逻辑

1. 先做字段标准化(避免格式坑)

首先得把所有字段转成统一格式,不然很容易出现误判:

  • 星期字段:统一转小写、去空格、排序(避免Mon,Tue和Tue,Mon被误判为不同),比如把Mon,tue处理成mon,tue
  • 时间字段:转成当天的分钟数(0点为0,23:59为1439),跨天的时段(比如结束时间早于开始时间)后续单独处理
  • 日期字段:转成标准的时间戳(比如29-5-2018转成2018-05-29对应的时间戳),注意如果date from晚于date to,要自动调整为正确的区间(比如29-5-2018到10-5-2018实际是2018-05-10到2018-05-29)

2. 逐条匹配已有条目

对新增条目,遍历所有已存在的业务条目,依次检查三个条件:

条件1:星期匹配

用标准化后的星期字符串直接比较,示例代码(Python):

def normalize_day(day_str):
    # 拆分、去空格、转小写、排序后再拼接,确保顺序不影响匹配
    sorted_days = sorted([d.strip().lower() for d in day_str.split(",")])
    return ",".join(sorted_days)

# 新增条目的星期标准化后的值
new_day = normalize_day(new_entry["day"])
# 已有条目的星期标准化后的值
existing_day = normalize_day(existing_entry["day"])
if new_day != existing_day:
    continue  # 星期不匹配,直接跳过这条已有条目

条件2:时段重叠判断

这里要处理跨天和非跨天两种情况:

def is_time_conflict(new_start_mins, new_end_mins, existing_start_mins, existing_end_mins):
    # 处理跨天时段:结束时间早于开始时间,说明是当天到次日的时段
    if new_end_mins < new_start_mins:
        # 跨天时段的冲突判断:只要已有时段和当天后半段或次日前半段重叠就算冲突
        return (existing_end_mins > new_start_mins) or (existing_start_mins < new_end_mins)
    else:
        # 非跨天时段:常规区间重叠判断,只要不是完全错开就冲突
        return not (new_end_mins <= existing_start_mins or new_start_mins >= existing_end_mins)

条件3:日期区间重叠判断

日期区间重叠的核心逻辑是:两个区间不是完全错开的,用时间戳判断的示例代码:

def is_date_conflict(new_from_ts, new_to_ts, existing_from_ts, existing_to_ts):
    # 先确保日期区间是正确的(from <= to)
    new_start_ts = min(new_from_ts, new_to_ts)
    new_end_ts = max(new_from_ts, new_to_ts)
    existing_start_ts = min(existing_from_ts, existing_to_ts)
    existing_end_ts = max(existing_from_ts, existing_to_ts)
    # 两个区间不冲突的唯一情况:一个完全在另一个的左边或右边
    return not (new_end_ts < existing_start_ts or new_start_ts > existing_end_ts)

3. 触发拦截

只要某条已有条目同时满足以上三个条件,就直接触发校验拦截,返回类似“该条目与已有业务条目存在时间冲突,请检查”的提示即可。

你的示例数据验证

你给出的两条测试数据,标准化后:

  • 星期都是mon,tue,完全匹配
  • 时段都是10:00(600分钟)到5:00(300分钟,跨天),时段重叠
  • 若日期区间存在重叠(比如示例中可能是日期输入笔误导致区间重叠),则完全符合拦截规则,会触发校验拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:10:37