如何按条件比对两个Unix时间戳列表?考勤系统开发问询
嘿,我来帮你搞定这个考勤系统的时间比对问题~ 先明确核心需求:我们要把学生的打卡日志和固定时间表的时间段做匹配,判断打卡是否有效、是否迟到,以及哪些时段缺卡对吧?
先理清楚比对的核心逻辑:
- 对每一条打卡记录,检查它是否落在某个考勤时间段(
timetable[i]到timetableEnd[i])内,再根据规则判断状态(正常/迟到/无效) - 对每一个考勤时间段,检查是否有对应的打卡记录,判断是否缺卡
下面用Python给你写个可直接运行的示例,用你提供的测试数据:
首先定义你的示例数据:
# 你提供的示例时间戳数据 timetable = [1519650000, 1519740000, 1519743600] # 考勤开始时间列表 timetableEnd = [1519653600, 1519743600, 1519747200] # 考勤结束时间列表 log = [1519739987, 1519744087] # 学生打卡日志
先整个小工具函数,把时间戳转成可读时间,方便调试看结果:
from datetime import datetime def ts_to_str(timestamp): return datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
场景1:判断每条打卡记录的状态
遍历每一条打卡记录,匹配对应的考勤时段,同时判断是否迟到(这里假设15分钟内打卡算正常,超过就算迟到,你可以自己调整阈值):
for log_ts in log: is_matched = False # 遍历每个考勤时段 for idx, (start_ts, end_ts) in enumerate(zip(timetable, timetableEnd)): # 检查打卡时间是否在当前考勤时段内 if start_ts <= log_ts <= end_ts: # 计算迟到时长(秒) delay_seconds = log_ts - start_ts # 自定义迟到阈值(这里设15分钟=900秒) late_threshold = 15 * 60 status = "正常" if delay_seconds <= late_threshold else "迟到" print(f"打卡时间:{ts_to_str(log_ts)} | 匹配时段:{ts_to_str(start_ts)} - {ts_to_str(end_ts)} | 状态:{status}") is_matched = True break # 找到匹配的时段就不用继续找了 if not is_matched: print(f"打卡时间:{ts_to_str(log_ts)} | 未匹配到任何有效考勤时段,属于无效打卡")
你的测试数据运行后会输出:
打卡时间:2018-02-27 13:59:47 | 未匹配到任何有效考勤时段,属于无效打卡
打卡时间:2018-02-27 15:08:07 | 匹配时段:2018-02-27 15:00:00 - 2018-02-27 16:00:00 | 状态:正常
场景2:检查每个考勤时段是否有打卡(缺卡判断)
遍历每个考勤时段,检查是否有对应的打卡记录:
for idx, (start_ts, end_ts) in enumerate(zip(timetable, timetableEnd)): # 用any()快速判断是否有打卡落在当前时段内 has_checkin = any(start_ts <= log_ts <= end_ts for log_ts in log) status = "已打卡" if has_checkin else "缺卡" print(f"考勤时段:{ts_to_str(start_ts)} - {ts_to_str(end_ts)} | 状态:{status}")
你的测试数据运行后会输出:
考勤时段:2018-02-26 13:00:00 - 2018-02-26 14:00:00 | 状态:缺卡
考勤时段:2018-02-27 14:00:00 - 2018-02-27 15:00:00 | 状态:缺卡
考勤时段:2018-02-27 15:00:00 - 2018-02-27 16:00:00 | 状态:已打卡
额外优化提示
- 如果你的数据量很大(比如上千条打卡记录和时段),可以先把时间表按开始时间排序,然后用二分查找来提高匹配效率,避免遍历所有时段
- 迟到阈值、允许提前打卡的时间范围等规则,都可以根据你的业务需求自定义调整
内容的提问来源于stack exchange,提问作者Han
相关产品推荐
相关产品推荐

