本文目录导读:

计算考勤时长的脚本需要根据具体的打卡数据格式(上班打卡时间、下班打卡时间、是否有休息时间扣除等)来设计,下面我将提供几种常见场景下的计算逻辑和伪代码/代码示例。
核心逻辑
考勤时长通常遵循以下公式: 实际工作时长 = 下班打卡时间 - 上班打卡时间 - 扣除的休息时间
场景与代码示例
最基础的双休制(无午休扣除)
数据假设:上班卡和下班卡是同一个日期,没有跨天,且没有午休。
- 输入:
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都行)。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播