本文目录导读:

计算考勤时长的脚本需要根据具体的打卡数据格式(上班打卡时间、下班打卡时间、是否有休息时间扣除等)来设计,下面我将提供几种常见场景下的计算逻辑和伪代码/代码示例。
核心逻辑
考勤时长通常遵循以下公式: 实际工作时长 = 下班打卡时间 - 上班打卡时间 - 扣除的休息时间
场景与代码示例
最基础的双休制(无午休扣除)
数据假设:上班卡和下班卡是同一个日期,没有跨天,且没有午休。
- 输入:
start_time,end_time - 输出: 工作小时数
Python 伪代码:
from datetime import datetime, timedelta
def calculate_hours(start_str, end_str, time_format="%Y-%m-%d %H:%M:%S"):
"""
计算考勤时长 (分钟)
"""
start = datetime.strptime(start_str, time_format)
end = datetime.strptime(end_str, time_format)
# 计算时间差
duration = end - start
# 返回总分钟数
total_minutes = duration.total_seconds() / 60
hours = total_minutes // 60
minutes = total_minutes % 60
print(f"工作时长: {int(hours)}小时{int(minutes)}分钟")
return total_minutes
包含固定的午休扣除(最常见)
假设:公司规定午休 1.5 小时(12:00 - 13:30)。 逻辑:如果员工上班时间包含这个区间,则自动扣除。
Python 代码:
from datetime import datetime, time, timedelta
def calculate_work_hours_with_lunch(start_str, end_str):
start = datetime.strptime(start_str, "%Y-%m-%d %H:%M:%S")
end = datetime.strptime(end_str, "%Y-%m-%d %H:%M:%S")
total_seconds = (end - start).total_seconds()
# 固定午休扣除条件(假设午休是 12:00 到 13:30)
lunch_start_time = time(12, 0)
lunch_end_time = time(13, 30)
lunch_duration_seconds = 1.5 * 3600 # 1.5小时以秒计
# 检查员工是否覆盖了整个午休时段
# 上班时间 <= 午休开始 && 下班时间 >= 午休结束
if start.time() <= lunch_start_time and end.time() >= lunch_end_time:
total_seconds -= lunch_duration_seconds
total_minutes = total_seconds / 60
hours = total_minutes // 60
minutes = total_minutes % 60
print(f"扣除午休后:{int(hours)}小时{int(minutes)}分钟")
return total_minutes
跨天打卡(夜班)
上班 22:00,下班 次日 06:00。
逻辑: 需要判断结束时间是否小于开始时间,如果是则加一天。
Pseudo代码:
def calculate_cross_day(start_str, end_str):
start = datetime.strptime(start_str, "%Y-%m-%d %H:%M:%S")
end = datetime.strptime(end_str, "%Y-%m-%d %H:%M:%S")
# 如果结束时间小于或等于开始时间,说明跨天
if end <= start:
end += timedelta(days=1) # 加一天
duration = end - start
total_minutes = duration.total_seconds() / 60
return total_minutes
处理迟到、早退、缺卡
在这种情况下,我们不只计算时间差,还需要和“标准班次”比较。
- 标准班次:09:00 - 18:00 (午休 1h)
- 迟到:上班打卡 > 09:00
- 早退:下班打卡 < 18:00
- 缺卡:没有打卡记录
核心逻辑:
- 获取系统标准上班/下班时间。
- 计算实际工作时长:
- 实际开始 = max(标准上班时间, 实际打卡上班时间)
- 实际结束 = min(标准下班时间, 实际打卡下班时间)
- 时长 = 实际结束 - 实际开始 - 午休
- 如果出现异常(缺卡、旷工),时长归零或标记为异常。
使用 Excel/Google Sheets 公式
如果你是用表格处理,不需要写完整的脚本,一个公式即可。
= (下班时间 - 上班时间) * 24 - 午休小时数
- 假设 B2 是上班时间,C2 是下班时间。
- 公式:
=(C2-B2)*24-1.5(1.5 表示1.5小时午休) - 结果:显示小时数(7.5)。
如果需要判断跨天(夜班),加个 IF:
=IF(C2<B2, (C2+1-B2)*24, (C2-B2)*24) - 1.5
进阶考虑:对接考勤机的数据清洗
在实际企业应用中,脚本往往需要处理更复杂的情况:
- 多次打卡:员工可能一天打多次卡,你需要制定规则,取第一次打卡作为上班,取最后一次打卡作为下班。
- 弹性工作制:有的公司允许 8:30 - 9:30 之间任意打卡,只要凑满8小时,需要动态计算下班时间。
- 加班计算:通常需要单独统计加班时长,且加班时长可能超过标准下班的1.5倍计算。
总结建议
- 确定数据源:是文本文件、Excel、数据库还是 API?
- 确定规则:午休多久?是否跨天?打卡几次取哪个?
- 处理异常:数据脏乱(空值、时间格式错误、早于凌晨4点打卡)如何处理?
如果你能提供具体的打卡数据样表(员工ID,卡号,打卡时间,打卡类型)和贵公司的考勤规则(上班时间、迟到定义、午休时长),我可以为你编写一个完整的、可直接运行的脚本(Python、js或SQL都行)。