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 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  阅读(41)  评论(0)    收藏  举报