脚本如何计算考勤时长

wen 实用脚本 29

本文目录导读:

脚本如何计算考勤时长

  1. 核心逻辑
  2. 场景与代码示例
  3. 进阶考虑:对接考勤机的数据清洗
  4. 总结建议

计算考勤时长的脚本需要根据具体的打卡数据格式(上班打卡时间、下班打卡时间、是否有休息时间扣除等)来设计,下面我将提供几种常见场景下的计算逻辑和伪代码/代码示例。

核心逻辑

考勤时长通常遵循以下公式: 实际工作时长 = 下班打卡时间 - 上班打卡时间 - 扣除的休息时间

场景与代码示例

最基础的双休制(无午休扣除)

数据假设:上班卡和下班卡是同一个日期,没有跨天,且没有午休。

  • 输入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
  • 缺卡:没有打卡记录

核心逻辑:

  1. 获取系统标准上班/下班时间。
  2. 计算实际工作时长
    • 实际开始 = max(标准上班时间, 实际打卡上班时间)
    • 实际结束 = min(标准下班时间, 实际打卡下班时间)
    • 时长 = 实际结束 - 实际开始 - 午休
  3. 如果出现异常(缺卡、旷工),时长归零或标记为异常。

使用 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


进阶考虑:对接考勤机的数据清洗

在实际企业应用中,脚本往往需要处理更复杂的情况:

  1. 多次打卡:员工可能一天打多次卡,你需要制定规则,取第一次打卡作为上班,取最后一次打卡作为下班。
  2. 弹性工作制:有的公司允许 8:30 - 9:30 之间任意打卡,只要凑满8小时,需要动态计算下班时间。
  3. 加班计算:通常需要单独统计加班时长,且加班时长可能超过标准下班的1.5倍计算。

总结建议

  1. 确定数据源:是文本文件、Excel、数据库还是 API?
  2. 确定规则:午休多久?是否跨天?打卡几次取哪个?
  3. 处理异常:数据脏乱(空值、时间格式错误、早于凌晨4点打卡)如何处理?

如果你能提供具体的打卡数据样表(员工ID,卡号,打卡时间,打卡类型)和贵公司的考勤规则(上班时间、迟到定义、午休时长),我可以为你编写一个完整的、可直接运行的脚本(Python、js或SQL都行)。

抱歉,评论功能暂时关闭!