使用Java计算两个日期之间的工作日和法定节假日

在现代软件开发中,日期计算是一个常见需求。特别是在管理项目时间、考勤、财务等场景下,我们需要精确地知道两个日期之间的工作天数和法定节假日。本文将详细讲解如何使用Java计算这两个内容。

计算流程

这项任务的流程大致可以分为以下几个步骤:

步骤 内容 描述
1 收集输入数据 接收两个日期以及法定假日的列表。
2 解析日期 将输入的字符串格式日期转换为Java中的LocalDate对象。
3 判断工作日 检查每一天是否是工作日(即不是周六和周日)及是否为法定假日。
4 统计工作日和假日 统计有效的工作日数量和假日数量。
5 输出结果 输出两个日期之间的工作日数量和法定假期。

流程图

flowchart TD
    A[开始] --> B[收集输入数据]
    B --> C[解析日期]
    C --> D[判断工作日]
    D --> E[统计工作日和假日]
    E --> F[输出结果]
    F --> G[结束]

甘特图

gantt
    title 计算工作日和法定假日
    dateFormat  YYYY-MM-DD
    section 任务
    收集输入数据        :done,    des1, 2023-10-01, 1d
    解析日期          :active,  des2, 2023-10-02, 1d
    判断工作日         :         des3, 2023-10-03, 2d
    统计工作日和假日       :         des4, 2023-10-05, 1d
    输出结果           :         des5, 2023-10-06, 1d

实现步骤

1. 收集输入数据

首先,我们需要获取用户输入的两个日期和法定节假日的信息。在实际应用中,这通常通过控制台输入或GUI实现。

import java.util.Arrays;
import java.util.List;

public class WorkdayCalculator {
    public static void main(String[] args) {
        // 定义两个日期和法定节假日的列表
        String startDate = "2023-10-01";
        String endDate = "2023-10-31";
        List<String> holidays = Arrays.asList("2023-10-02", "2023-10-05"); // 自定义的假日
    }
}

2. 解析日期

将输入的字符串格式日期转换为LocalDate对象,Java 8引入的java.time包提供了很好的日期处理工具。

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate start = LocalDate.parse(startDate, formatter);
LocalDate end = LocalDate.parse(endDate, formatter);

3. 判断工作日

我们需要判断给定日期是否是工作日。工作日是指非周末且不在假日列表中的日期。

import java.util.HashSet;

HashSet<LocalDate> holidaySet = new HashSet<>();
for (String holiday : holidays) {
    holidaySet.add(LocalDate.parse(holiday, formatter));
}

int workingDays = 0;
int holidayCount = 0;

for (LocalDate date = start; !date.isAfter(end); date = date.plusDays(1)) {
    // 判断是否为工作日
    if (date.getDayOfWeek().getValue() < 6 && !holidaySet.contains(date)) {
        workingDays++;
    } else if (holidaySet.contains(date)) {
        holidayCount++;
    }
}

4. 统计工作日和假日

在上面的代码中的循环中,我们已经同时统计了工作日和假日。

5. 输出结果

最后,将统计结果输出到控制台。

System.out.println("工作日数量: " + workingDays);
System.out.println("法定假日数量: " + holidayCount);

完整代码

将上述所有代码整合到一起,形成一个完整的程序:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;

public class WorkdayCalculator {
    public static void main(String[] args) {
        // 定义两个日期和法定节假日的列表
        String startDate = "2023-10-01";
        String endDate = "2023-10-31";
        List<String> holidays = Arrays.asList("2023-10-02", "2023-10-05");
        
        // 解析日期
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate start = LocalDate.parse(startDate, formatter);
        LocalDate end = LocalDate.parse(endDate, formatter);
        
        // 判断工作日
        HashSet<LocalDate> holidaySet = new HashSet<>();
        for (String holiday : holidays) {
            holidaySet.add(LocalDate.parse(holiday, formatter));
        }

        int workingDays = 0;
        int holidayCount = 0;

        for (LocalDate date = start; !date.isAfter(end); date = date.plusDays(1)) {
            // 判断是否为工作日
            if (date.getDayOfWeek().getValue() < 6 && !holidaySet.contains(date)) {
                workingDays++;
            } else if (holidaySet.contains(date)) {
                holidayCount++;
            }
        }

        // 输出结果
        System.out.println("工作日数量: " + workingDays);
        System.out.println("法定假日数量: " + holidayCount);
    }
}

总结

通过以上步骤,我们清楚地了解了如何使用Java计算两个日期之间的工作日和法定节假日。掌握日期计算的技巧可以帮助您在开发中解决许多实际问题。在实践中,您可以根据具体需求进一步扩展和优化此功能。希望本文能对您有所帮助,欢迎提出问题或分享您的经验!