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

如何按条件比对两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:46:31