4.5 Calendar 类

import java.util.*;
import java.text.SimpleDateFormat;

public class WorkdayCalculator {
// 示例数据:节假日和调休日(格式:yyyy-MM-dd)
private static final Set HOLIDAYS = new HashSet<>(Arrays.asList(
// 元旦
"2025-01-01",

        // 春节
        "2025-01-28", "2025-01-29", "2025-01-30",
        "2025-01-31", "2025-02-01", "2025-02-02", "2025-02-03",

        // 清明节
        "2025-04-04", "2025-04-05", "2025-04-06",

        // 劳动节
        "2025-05-01", "2025-05-02", "2025-05-03",

        // 端午节
        "2025-05-30", "2025-05-31", "2025-06-01",

        // 中秋节
        "2025-09-06", "2025-09-07", "2025-09-08",

        // 国庆节
        "2025-10-01", "2025-10-02", "2025-10-03",
        "2025-10-04", "2025-10-05", "2025-10-06", "2025-10-07"
));
private static final Set<String> WORK_WEEKENDS = new HashSet<>(Arrays.asList(
        // 春节调休
        "2025-01-25", // 原周六上班
        "2025-02-08", // 原周六上班

        // 国庆节调休
        "2025-09-27", // 原周六上班
        "2025-10-11"  // 原周六上班
));

private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

public static int calculateWorkdays(Calendar start, Calendar end) {
    if (start.after(end)) {
        throw new IllegalArgumentException("开始时间不能晚于结束时间");
    }

    int workdays = 0;
    Calendar current = (Calendar) start.clone();

    while (!current.after(end)) {
        String currentDateString = DATE_FORMAT.format(current.getTime());
        boolean isHoliday = HOLIDAYS.contains(currentDateString);
        boolean isWeekend = current.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || current.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY;

        if (!isHoliday && !isWeekend || WORK_WEEKENDS.contains(currentDateString)) {
            workdays++;
        }

        current.add(Calendar.DAY_OF_YEAR, 1);
    }

    return workdays;
}

public static void main(String[] args) throws ParseException {
    Calendar start = Calendar.getInstance();
    start.set(2025, Calendar.JANUARY, 1);
    Calendar end = Calendar.getInstance();
    end.set(2025, Calendar.DECEMBER, 31);

    int workdays = calculateWorkdays(start, end);
    System.out.println("2025年的有效工作日天数为: " + workdays);
}

}
以下是对您提供的Java代码段的详细解释:

变量初始化

int workdays = 0;
这行代码初始化了一个名为workdays的变量,用于记录工作日的天数,初始值为0。

Calendar current = (Calendar) start.clone();
这行代码创建了一个Calendar对象current,它是通过克隆另一个Calendar对象start得到的。这意味着current将拥有与start相同的日期和时间值。

循环遍历日期

while (!current.after(end)) { ... }
这是一个while循环,它将持续执行,直到current日期超过(after)另一个Calendar对象end表示的日期为止。这个循环用于遍历从start到end之间的所有日期。

日期格式化与判断

String currentDateString = DATE_FORMAT.format(current.getTime());
在循环内部,首先使用DATE_FORMAT(一个日期格式化对象)将current日期格式化为字符串currentDateString。

boolean isHoliday = HOLIDAYS.contains(currentDateString);
接着,检查一个名为HOLIDAYS的集合是否包含currentDateString。如果包含,说明当前日期是节假日,isHoliday将被设置为true。

boolean isWeekend = current.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || current.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY;
然后,判断当前日期是否是周末(星期六或星期日)。如果是,isWeekend将被设置为true。

工作日计数

if (!isHoliday && !isWeekend || WORK_WEEKENDS.contains(currentDateString)) { workdays++; }
这行代码使用了一个条件判断来决定是否将当前日期计为工作日。如果当前日期既不是节假日也不是周末,或者它在一个名为WORK_WEEKENDS的集合中(表示即使是周末也要工作),则workdays的值将增加1。

日期递增

current.add(Calendar.DAY_OF_YEAR, 1);
在循环的每次迭代结束时,将current日期增加一天,以便在下一次迭代中检查下一个日期。

学习要点:
1.hashset
2.Calendar类

posted @ 2025-04-05 21:34  Toby0919  阅读(24)  评论(0)    收藏  举报