Java 考勤多段时间范围的判断

在现代企业管理中,考勤系统的设计与实现变得尤为重要。考勤管理涉及员工的打卡时间、请假、加班等情况,而如何科学地判断和处理这些时间段是系统设计中的一个关键问题。本文将介绍如何在Java中实现对多段时间范围的判断,并提供相应的代码示例。

1. 多段时间范围的概念

我们考虑一种场景:一名员工可能在某一时间段内需要上班,同时还可能有请假或加班的情况。我们的目标是判断一个特定时间点是否在员工的上班时间段内,或者是否与请假和加班时间段重叠。

2. 流程图

在判断时间范围时,我们可以将流程分为几个步骤。以下是相应的流程图:

在上班时间 在请假时间 在加班时间 不在任何时间 开始 要判断的时间 确认上班 确认请假 确认加班 未上班 结束
3. Java代码实现

接下来我们来实现一个简单的Java类,用于判断给定时间是否在多个时间段中:

import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;

class TimeRange {
    private LocalTime start;
    private LocalTime end;

    public TimeRange(LocalTime start, LocalTime end) {
        this.start = start;
        this.end = end;
    }

    public boolean contains(LocalTime time) {
        return !time.isBefore(start) && !time.isAfter(end);
    }
}

public class AttendanceChecker {
    private List<TimeRange> workHours;
    private List<TimeRange> leaveHours;
    private List<TimeRange> overtimeHours;

    public AttendanceChecker() {
        workHours = new ArrayList<>();
        leaveHours = new ArrayList<>();
        overtimeHours = new ArrayList<>();
    }

    public void addWorkHour(TimeRange range) {
        workHours.add(range);
    }

    public void addLeaveHour(TimeRange range) {
        leaveHours.add(range);
    }

    public void addOvertimeHour(TimeRange range) {
        overtimeHours.add(range);
    }

    public String checkAttendance(LocalTime time) {
        for (TimeRange range : workHours) {
            if (range.contains(time)) {
                return "确认上班";
            }
        }
        for (TimeRange range : leaveHours) {
            if (range.contains(time)) {
                return "确认请假";
            }
        }
        for (TimeRange range : overtimeHours) {
            if (range.contains(time)) {
                return "确认加班";
            }
        }
        return "未上班";
    }

    public static void main(String[] args) {
        AttendanceChecker checker = new AttendanceChecker();
        checker.addWorkHour(new TimeRange(LocalTime.of(9, 0), LocalTime.of(17, 0)));
        checker.addLeaveHour(new TimeRange(LocalTime.of(12, 0), LocalTime.of(13, 0)));
        checker.addOvertimeHour(new TimeRange(LocalTime.of(17, 0), LocalTime.of(19, 0)));

        LocalTime checkTime = LocalTime.of(10, 0);
        System.out.println(checker.checkAttendance(checkTime)); // 输出: 确认上班

        checkTime = LocalTime.of(12, 30);
        System.out.println(checker.checkAttendance(checkTime)); // 输出: 确认请假
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
4. 关系图

为了更好地展示类之间的关系,我们可以使用ER图描绘 class间的关系:

ATTENDANCE_CHECKER TIME_RANGE LocalTime start LocalTime end contains manages
结论

通过以上代码示例,我们实现了一个简单的考勤时间范围判断器。使用TimeRange类来定义时间段,并在AttendanceChecker中管理这些时间段的关系。这种设计使得扩展和维护变得更加容易,同时也能清晰地表达各类时间段之间的逻辑。希望本文能为您在考勤系统的设计与实现上提供一些启发。