4.5 Calendar 类
import java.util.*;
import java.text.SimpleDateFormat;
public class WorkdayCalculator {
// 示例数据:节假日和调休日(格式:yyyy-MM-dd)
private static final Set
// 元旦
"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类

浙公网安备 33010602011771号