日期时段星期重复校验需求:新增条目冲突校验实现
业务条目时间冲突校验实现方案
嘿,针对你提到的包含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
相关产品推荐
相关产品推荐

