【脚本】计算上班时间的算法

本文介绍了一种计算实际工作时间的算法,考虑到非工作时间段如午休和傍晚休息,适用于不同上下班模式。算法通过遍历非工作时间列表,跳过这些时间段来累积有效的上班时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上班时间

所谓上班时间是指从上班到下班的时间里,能够被算作工时的那部分时间总和。

算法

从上班到下班之间至少有一个时间段是不算工作时间的,即中午的休息时间,一般是12:00-14:00,如果晚上有加班,则傍晚的16:00-19:00也不算工作时间。
而上班时间可以从一天之中的任何时段开始,需要根据不同的上下班情况来累积上班时间。

设定A为按起始顺序排序的、且任意两个区间没有时间交集的非工作时间段列表
设start,end分别为上下班的时间(以分钟为单位),则计算上下班的算法如下:

# 通过遍历跳过非工作时间进行工作时间的累加
calculate(A,start,end):
    if end < start:
        # 如果是次日凌晨下班,则需要调整分钟时间
        end = end + 24*60
    sum = 0
    error = False
    completed = False
    for rangeTime in A:
        rangeStart,rangeEnd = rangeTime
        # validate
        if rangeEnd < rangeStart:
            error = True
            break
        if start >= rangeStart:
            if end <= rangeEnd:
                # 没有更多有效区间
                completed = True
                break
            if start < rangeEnd:
                start = rangeEnd
            continue
        if end <= rangeStart:
            sum = sum + end - start
            completed = True
            break
        sum += rangeStart - start
        start = rangeEnd
        if start >= end:
            completed = True
            break
    if not error:
        if not completed and end >= start:
            sum = sum + end - start
        return sum
   return -1
试题:该程序(Test.exe)用于统计、记录某单位全体员工一天的考勤情况。 输入:员工基本信息文件(文本文件)、全天出入记录的数据文件(文本文件) 1. 员工基本信息文件(参见employee.txt) 每行记录一位员工的基本信息,格式为:姓名,工号(例如:张三,34251),其中姓名(超过20个字符)和工号(整型); 2. 全天出入记录的数据文件(参见log.txt) 该单位的门禁系统每天生成一个员工全天出入记录的数据文件,记录出入的工作人员工号、出入的时间以及出入类型(O:出,I:入), 记录按时间先后记录 文件中每行记录一次出或入的信息 每条记录的格式为:工号,时间,类型(例如:34251,08:30,I),其中时间格式为hh:mm。 程序要完成的功能 请通过程序读取员工基本信息文件和门禁系统全天出入记录的数据文件,计算各工作人员当天的总共在岗时间,并将结果保存至c:\result.txt文件中。要求结果中包含有姓名,工号,在岗时间等信息。 注:员工基本信息文件和数据文件的名称通过命令行参数的形式输入 (例如:Test.exe employee.txt log.txt)。 输出:员工在岗时间统计文件(文本文件) 员工在岗时间统计文件(参见result.txt) 文件中每行记录一位工作人员的在岗时间信息。 格式为:姓名,工号,在岗时间(例如:张三,34251,8小10钟)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值