代码
import cn.hutool.core.text.StrFormatter;
import com.google.common.collect.Lists;
import lombok.Data;
import java.time.LocalDate;
import java.time.format.TextStyle;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Collectors;
public class HolidayCalculator {
public static void main(String[] args) {
HolidayCalculator calculator = new HolidayCalculator();
Map<Integer, List<Holiday>> holidays = calculator.holidays();
int maxYear = holidays.keySet().stream().max(Integer::compareTo).get();
LocalDate date = LocalDate.now();
while (true) {
Info info = calculator.calculate(date, holidays);
System.out.println(info.info());
date = date.plusDays(1);
if (date.getYear() > maxYear) {
break;
}
}
}
private Map<Integer, List<Holiday>> holidays() {
Map<Integer, List<Holiday>> holidays = new HashMap<>();
holidays.put(2024, Lists.newArrayList(
new Holiday("元旦", "2024-01-01"),
new Holiday("春节", "2024-02-10", "2024-02-17", Lists.newArrayList("2024-02-04", "2024-02-18")),
new Holiday("清明节", "2024-04-04", "2024-04-06", Lists.newArrayList("2024-04-07")),
new Holiday("劳动节", "2024-05-01", "2024-05-05", Lists.newArrayList("2024-04-28", "2024-05-11")),
new Holiday("端午节", "2024-06-10"),
new Holiday("中秋节", "2024-09-15", "2024-09-17", Lists.newArrayList("2024-09-14")),
new Holiday("国庆节", "2024-10-01", "2024-10-07", Lists.newArrayList("2024-09-29", "2024-10-12"))
));
return holidays;
}
public Info calculate(LocalDate date, Map<Integer, List<Holiday>> holidays) {
return this.calculate(date, holidays.getOrDefault(date.getYear(), new ArrayList<>()));
}
public Info calculate(LocalDate date, List<Holiday> holidays) {
for (Holiday holiday : holidays) {
if (!date.isBefore(holiday.getStart()) && !date.isAfter(holiday.getEnd())) {
return new Info(date, Type.HOLIDAY, holiday.getName());
}
for (LocalDate overtime : holiday.getOvertime()) {
if (date.isEqual(overtime)) {
return new Info(date, Type.OVERTIME, holiday.getName() + "-调休");
}
}
}
if (date.getDayOfWeek().getValue() <= 5) {
return new Info(date, Type.WORKDAY);
} else {
return new Info(date, Type.WEEKEND);
}
}
public enum Type {
WORKDAY,
WEEKEND,
HOLIDAY,
OVERTIME;
public static boolean isWorkday(Type type) {
return WORKDAY == type || OVERTIME == type;
}
}
@Data
public static class Holiday {
private String name;
private LocalDate start;
private LocalDate end;
private List<LocalDate> overtime;
public Holiday(String name, String start) {
this.name = name;
this.start = LocalDate.parse(start);
this.end = LocalDate.parse(start);
this.overtime = Collections.emptyList();
}
public Holiday(String name, String start, String end) {
this.name = name;
this.start = LocalDate.parse(start);
this.end = LocalDate.parse(end);
this.overtime = Collections.emptyList();
}
public Holiday(String name, String start, String end, List<String> overtime) {
this.name = name;
this.start = LocalDate.parse(start);
this.end = LocalDate.parse(end);
this.overtime = overtime.stream().map(LocalDate::parse).collect(Collectors.toList());
}
}
@Data
public static class Info {
private LocalDate date;
private Type type;
private boolean workday;
private String remark;
public Info(LocalDate date, Type type) {
this.date = date;
this.type = type;
this.workday = Type.isWorkday(type);
this.remark = date.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.CHINA);
}
public Info(LocalDate date, Type type, String remark) {
this.date = date;
this.type = type;
this.workday = Type.isWorkday(type);
this.remark = remark;
}
public String info() {
return StrFormatter.format("{} \t {} \t {} \t {}", date, workday ? "上班" : "放假", type, remark);
}
}
}
结果
2023-12-25 上班 WORKDAY 星期一
2023-12-26 上班 WORKDAY 星期二
2023-12-27 上班 WORKDAY 星期三
2023-12-28 上班 WORKDAY 星期四
2023-12-29 上班 WORKDAY 星期五
2023-12-30 放假 WEEKEND 星期六
2023-12-31 放假 WEEKEND 星期日
2024-01-01 放假 HOLIDAY 元旦
2024-01-02 上班 WORKDAY 星期二
2024-01-03 上班 WORKDAY 星期三
2024-01-04 上班 WORKDAY 星期四
2024-01-05 上班 WORKDAY 星期五
2024-01-06 放假 WEEKEND 星期六
2024-01-07 放假 WEEKEND 星期日
2024-01-08 上班 WORKDAY 星期一
2024-01-09 上班 WORKDAY 星期二
2024-01-10 上班 WORKDAY 星期三
2024-01-11 上班 WORKDAY 星期四
2024-01-12 上班 WORKDAY 星期五
2024-01-13 放假 WEEKEND 星期六
2024-01-14 放假 WEEKEND 星期日
2024-01-15 上班 WORKDAY 星期一
2024-01-16 上班 WORKDAY 星期二
2024-01-17 上班 WORKDAY 星期三
2024-01-18 上班 WORKDAY 星期四
2024-01-19 上班 WORKDAY 星期五
2024-01-20 放假 WEEKEND 星期六
2024-01-21 放假 WEEKEND 星期日
2024-01-22 上班 WORKDAY 星期一
2024-01-23 上班 WORKDAY 星期二
2024-01-24 上班 WORKDAY 星期三
2024-01-25 上班 WORKDAY 星期四
2024-01-26 上班 WORKDAY 星期五
2024-01-27 放假 WEEKEND 星期六
2024-01-28 放假 WEEKEND 星期日
2024-01-29 上班 WORKDAY 星期一
2024-01-30 上班 WORKDAY 星期二
2024-01-31 上班 WORKDAY 星期三
2024-02-01 上班 WORKDAY 星期四
2024-02-02 上班 WORKDAY 星期五
2024-02-03 放假 WEEKEND 星期六
2024-02-04 上班 OVERTIME 春节-调休
2024-02-05 上班 WORKDAY 星期一
2024-02-06 上班 WORKDAY 星期二
2024-02-07 上班 WORKDAY 星期三
2024-02-08 上班 WORKDAY 星期四
2024-02-09 上班 WORKDAY 星期五
2024-02-10 放假 HOLIDAY 春节
2024-02-11 放假 HOLIDAY 春节
2024-02-12 放假 HOLIDAY 春节
2024-02-13 放假 HOLIDAY 春节
2024-02-14 放假 HOLIDAY 春节
2024-02-15 放假 HOLIDAY 春节
2024-02-16 放假 HOLIDAY 春节
2024-02-17 放假 HOLIDAY 春节
2024-02-18 上班 OVERTIME 春节-调休
2024-02-19 上班 WORKDAY 星期一
2024-02-20 上班 WORKDAY 星期二
2024-02-21 上班 WORKDAY 星期三
2024-02-22 上班 WORKDAY 星期四
2024-02-23 上班 WORKDAY 星期五
2024-02-24 放假 WEEKEND 星期六
2024-02-25 放假 WEEKEND 星期日
2024-02-26 上班 WORKDAY 星期一
2024-02-27 上班 WORKDAY 星期二
2024-02-28 上班 WORKDAY 星期三
2024-02-29 上班 WORKDAY 星期四
2024-03-01 上班 WORKDAY 星期五
2024-03-02 放假 WEEKEND 星期六
2024-03-03 放假 WEEKEND 星期日
2024-03-04 上班 WORKDAY 星期一
2024-03-05 上班 WORKDAY 星期二
2024-03-06 上班 WORKDAY 星期三
2024-03-07 上班 WORKDAY 星期四
2024-03-08 上班 WORKDAY 星期五
2024-03-09 放假 WEEKEND 星期六
2024-03-10 放假 WEEKEND 星期日
2024-03-11 上班 WORKDAY 星期一
2024-03-12 上班 WORKDAY 星期二
2024-03-13 上班 WORKDAY 星期三
2024-03-14 上班 WORKDAY 星期四
2024-03-15 上班 WORKDAY 星期五
2024-03-16 放假 WEEKEND 星期六
2024-03-17 放假 WEEKEND 星期日
2024-03-18 上班 WORKDAY 星期一
2024-03-19 上班 WORKDAY 星期二
2024-03-20 上班 WORKDAY 星期三
2024-03-21 上班 WORKDAY 星期四
2024-03-22 上班 WORKDAY 星期五
2024-03-23 放假 WEEKEND 星期六
2024-03-24 放假 WEEKEND 星期日
2024-03-25 上班 WORKDAY 星期一
2024-03-26 上班 WORKDAY 星期二
2024-03-27 上班 WORKDAY 星期三
2024-03-28 上班 WORKDAY 星期四
2024-03-29 上班 WORKDAY 星期五
2024-03-30 放假 WEEKEND 星期六
2024-03-31 放假 WEEKEND 星期日
2024-04-01 上班 WORKDAY 星期一
2024-04-02 上班 WORKDAY 星期二
2024-04-03 上班 WORKDAY 星期三
2024-04-04 放假 HOLIDAY 清明节
2024-04-05 放假 HOLIDAY 清明节
2024-04-06 放假 HOLIDAY 清明节
2024-04-07 上班 OVERTIME 清明节-调休
2024-04-08 上班 WORKDAY 星期一
2024-04-09 上班 WORKDAY 星期二
2024-04-10 上班 WORKDAY 星期三
2024-04-11 上班 WORKDAY 星期四
2024-04-12 上班 WORKDAY 星期五
2024-04-13 放假 WEEKEND 星期六
2024-04-14 放假 WEEKEND 星期日
2024-04-15 上班 WORKDAY 星期一
2024-04-16 上班 WORKDAY 星期二
2024-04-17 上班 WORKDAY 星期三
2024-04-18 上班 WORKDAY 星期四
2024-04-19 上班 WORKDAY 星期五
2024-04-20 放假 WEEKEND 星期六
2024-04-21 放假 WEEKEND 星期日
2024-04-22 上班 WORKDAY 星期一
2024-04-23 上班 WORKDAY 星期二
2024-04-24 上班 WORKDAY 星期三
2024-04-25 上班 WORKDAY 星期四
2024-04-26 上班 WORKDAY 星期五
2024-04-27 放假 WEEKEND 星期六
2024-04-28 上班 OVERTIME 劳动节-调休
2024-04-29 上班 WORKDAY 星期一
2024-04-30 上班 WORKDAY 星期二
2024-05-01 放假 HOLIDAY 劳动节
2024-05-02 放假 HOLIDAY 劳动节
2024-05-03 放假 HOLIDAY 劳动节
2024-05-04 放假 HOLIDAY 劳动节
2024-05-05 放假 HOLIDAY 劳动节
2024-05-06 上班 WORKDAY 星期一
2024-05-07 上班 WORKDAY 星期二
2024-05-08 上班 WORKDAY 星期三
2024-05-09 上班 WORKDAY 星期四
2024-05-10 上班 WORKDAY 星期五
2024-05-11 上班 OVERTIME 劳动节-调休
2024-05-12 放假 WEEKEND 星期日
2024-05-13 上班 WORKDAY 星期一
2024-05-14 上班 WORKDAY 星期二
2024-05-15 上班 WORKDAY 星期三
2024-05-16 上班 WORKDAY 星期四
2024-05-17 上班 WORKDAY 星期五
2024-05-18 放假 WEEKEND 星期六
2024-05-19 放假 WEEKEND 星期日
2024-05-20 上班 WORKDAY 星期一
2024-05-21 上班 WORKDAY 星期二
2024-05-22 上班 WORKDAY 星期三
2024-05-23 上班 WORKDAY 星期四
2024-05-24 上班 WORKDAY 星期五
2024-05-25 放假 WEEKEND 星期六
2024-05-26 放假 WEEKEND 星期日
2024-05-27 上班 WORKDAY 星期一
2024-05-28 上班 WORKDAY 星期二
2024-05-29 上班 WORKDAY 星期三
2024-05-30 上班 WORKDAY 星期四
2024-05-31 上班 WORKDAY 星期五
2024-06-01 放假 WEEKEND 星期六
2024-06-02 放假 WEEKEND 星期日
2024-06-03 上班 WORKDAY 星期一
2024-06-04 上班 WORKDAY 星期二
2024-06-05 上班 WORKDAY 星期三
2024-06-06 上班 WORKDAY 星期四
2024-06-07 上班 WORKDAY 星期五
2024-06-08 放假 WEEKEND 星期六
2024-06-09 放假 WEEKEND 星期日
2024-06-10 放假 HOLIDAY 端午节
2024-06-11 上班 WORKDAY 星期二
2024-06-12 上班 WORKDAY 星期三
2024-06-13 上班 WORKDAY 星期四
2024-06-14 上班 WORKDAY 星期五
2024-06-15 放假 WEEKEND 星期六
2024-06-16 放假 WEEKEND 星期日
2024-06-17 上班 WORKDAY 星期一
2024-06-18 上班 WORKDAY 星期二
2024-06-19 上班 WORKDAY 星期三
2024-06-20 上班 WORKDAY 星期四
2024-06-21 上班 WORKDAY 星期五
2024-06-22 放假 WEEKEND 星期六
2024-06-23 放假 WEEKEND 星期日
2024-06-24 上班 WORKDAY 星期一
2024-06-25 上班 WORKDAY 星期二
2024-06-26 上班 WORKDAY 星期三
2024-06-27 上班 WORKDAY 星期四
2024-06-28 上班 WORKDAY 星期五
2024-06-29 放假 WEEKEND 星期六
2024-06-30 放假 WEEKEND 星期日
2024-07-01 上班 WORKDAY 星期一
2024-07-02 上班 WORKDAY 星期二
2024-07-03 上班 WORKDAY 星期三
2024-07-04 上班 WORKDAY 星期四
2024-07-05 上班 WORKDAY 星期五
2024-07-06 放假 WEEKEND 星期六
2024-07-07 放假 WEEKEND 星期日
2024-07-08 上班 WORKDAY 星期一
2024-07-09 上班 WORKDAY 星期二
2024-07-10 上班 WORKDAY 星期三
2024-07-11 上班 WORKDAY 星期四
2024-07-12 上班 WORKDAY 星期五
2024-07-13 放假 WEEKEND 星期六
2024-07-14 放假 WEEKEND 星期日
2024-07-15 上班 WORKDAY 星期一
2024-07-16 上班 WORKDAY 星期二
2024-07-17 上班 WORKDAY 星期三
2024-07-18 上班 WORKDAY 星期四
2024-07-19 上班 WORKDAY 星期五
2024-07-20 放假 WEEKEND 星期六
2024-07-21 放假 WEEKEND 星期日
2024-07-22 上班 WORKDAY 星期一
2024-07-23 上班 WORKDAY 星期二
2024-07-24 上班 WORKDAY 星期三
2024-07-25 上班 WORKDAY 星期四
2024-07-26 上班 WORKDAY 星期五
2024-07-27 放假 WEEKEND 星期六
2024-07-28 放假 WEEKEND 星期日
2024-07-29 上班 WORKDAY 星期一
2024-07-30 上班 WORKDAY 星期二
2024-07-31 上班 WORKDAY 星期三
2024-08-01 上班 WORKDAY 星期四
2024-08-02 上班 WORKDAY 星期五
2024-08-03 放假 WEEKEND 星期六
2024-08-04 放假 WEEKEND 星期日
2024-08-05 上班 WORKDAY 星期一
2024-08-06 上班 WORKDAY 星期二
2024-08-07 上班 WORKDAY 星期三
2024-08-08 上班 WORKDAY 星期四
2024-08-09 上班 WORKDAY 星期五
2024-08-10 放假 WEEKEND 星期六
2024-08-11 放假 WEEKEND 星期日
2024-08-12 上班 WORKDAY 星期一
2024-08-13 上班 WORKDAY 星期二
2024-08-14 上班 WORKDAY 星期三
2024-08-15 上班 WORKDAY 星期四
2024-08-16 上班 WORKDAY 星期五
2024-08-17 放假 WEEKEND 星期六
2024-08-18 放假 WEEKEND 星期日
2024-08-19 上班 WORKDAY 星期一
2024-08-20 上班 WORKDAY 星期二
2024-08-21 上班 WORKDAY 星期三
2024-08-22 上班 WORKDAY 星期四
2024-08-23 上班 WORKDAY 星期五
2024-08-24 放假 WEEKEND 星期六
2024-08-25 放假 WEEKEND 星期日
2024-08-26 上班 WORKDAY 星期一
2024-08-27 上班 WORKDAY 星期二
2024-08-28 上班 WORKDAY 星期三
2024-08-29 上班 WORKDAY 星期四
2024-08-30 上班 WORKDAY 星期五
2024-08-31 放假 WEEKEND 星期六
2024-09-01 放假 WEEKEND 星期日
2024-09-02 上班 WORKDAY 星期一
2024-09-03 上班 WORKDAY 星期二
2024-09-04 上班 WORKDAY 星期三
2024-09-05 上班 WORKDAY 星期四
2024-09-06 上班 WORKDAY 星期五
2024-09-07 放假 WEEKEND 星期六
2024-09-08 放假 WEEKEND 星期日
2024-09-09 上班 WORKDAY 星期一
2024-09-10 上班 WORKDAY 星期二
2024-09-11 上班 WORKDAY 星期三
2024-09-12 上班 WORKDAY 星期四
2024-09-13 上班 WORKDAY 星期五
2024-09-14 上班 OVERTIME 中秋节-调休
2024-09-15 放假 HOLIDAY 中秋节
2024-09-16 放假 HOLIDAY 中秋节
2024-09-17 放假 HOLIDAY 中秋节
2024-09-18 上班 WORKDAY 星期三
2024-09-19 上班 WORKDAY 星期四
2024-09-20 上班 WORKDAY 星期五
2024-09-21 放假 WEEKEND 星期六
2024-09-22 放假 WEEKEND 星期日
2024-09-23 上班 WORKDAY 星期一
2024-09-24 上班 WORKDAY 星期二
2024-09-25 上班 WORKDAY 星期三
2024-09-26 上班 WORKDAY 星期四
2024-09-27 上班 WORKDAY 星期五
2024-09-28 放假 WEEKEND 星期六
2024-09-29 上班 OVERTIME 国庆节-调休
2024-09-30 上班 WORKDAY 星期一
2024-10-01 放假 HOLIDAY 国庆节
2024-10-02 放假 HOLIDAY 国庆节
2024-10-03 放假 HOLIDAY 国庆节
2024-10-04 放假 HOLIDAY 国庆节
2024-10-05 放假 HOLIDAY 国庆节
2024-10-06 放假 HOLIDAY 国庆节
2024-10-07 放假 HOLIDAY 国庆节
2024-10-08 上班 WORKDAY 星期二
2024-10-09 上班 WORKDAY 星期三
2024-10-10 上班 WORKDAY 星期四
2024-10-11 上班 WORKDAY 星期五
2024-10-12 上班 OVERTIME 国庆节-调休
2024-10-13 放假 WEEKEND 星期日
2024-10-14 上班 WORKDAY 星期一
2024-10-15 上班 WORKDAY 星期二
2024-10-16 上班 WORKDAY 星期三
2024-10-17 上班 WORKDAY 星期四
2024-10-18 上班 WORKDAY 星期五
2024-10-19 放假 WEEKEND 星期六
2024-10-20 放假 WEEKEND 星期日
2024-10-21 上班 WORKDAY 星期一
2024-10-22 上班 WORKDAY 星期二
2024-10-23 上班 WORKDAY 星期三
2024-10-24 上班 WORKDAY 星期四
2024-10-25 上班 WORKDAY 星期五
2024-10-26 放假 WEEKEND 星期六
2024-10-27 放假 WEEKEND 星期日
2024-10-28 上班 WORKDAY 星期一
2024-10-29 上班 WORKDAY 星期二
2024-10-30 上班 WORKDAY 星期三
2024-10-31 上班 WORKDAY 星期四
2024-11-01 上班 WORKDAY 星期五
2024-11-02 放假 WEEKEND 星期六
2024-11-03 放假 WEEKEND 星期日
2024-11-04 上班 WORKDAY 星期一
2024-11-05 上班 WORKDAY 星期二
2024-11-06 上班 WORKDAY 星期三
2024-11-07 上班 WORKDAY 星期四
2024-11-08 上班 WORKDAY 星期五
2024-11-09 放假 WEEKEND 星期六
2024-11-10 放假 WEEKEND 星期日
2024-11-11 上班 WORKDAY 星期一
2024-11-12 上班 WORKDAY 星期二
2024-11-13 上班 WORKDAY 星期三
2024-11-14 上班 WORKDAY 星期四
2024-11-15 上班 WORKDAY 星期五
2024-11-16 放假 WEEKEND 星期六
2024-11-17 放假 WEEKEND 星期日
2024-11-18 上班 WORKDAY 星期一
2024-11-19 上班 WORKDAY 星期二
2024-11-20 上班 WORKDAY 星期三
2024-11-21 上班 WORKDAY 星期四
2024-11-22 上班 WORKDAY 星期五
2024-11-23 放假 WEEKEND 星期六
2024-11-24 放假 WEEKEND 星期日
2024-11-25 上班 WORKDAY 星期一
2024-11-26 上班 WORKDAY 星期二
2024-11-27 上班 WORKDAY 星期三
2024-11-28 上班 WORKDAY 星期四
2024-11-29 上班 WORKDAY 星期五
2024-11-30 放假 WEEKEND 星期六
2024-12-01 放假 WEEKEND 星期日
2024-12-02 上班 WORKDAY 星期一
2024-12-03 上班 WORKDAY 星期二
2024-12-04 上班 WORKDAY 星期三
2024-12-05 上班 WORKDAY 星期四
2024-12-06 上班 WORKDAY 星期五
2024-12-07 放假 WEEKEND 星期六
2024-12-08 放假 WEEKEND 星期日
2024-12-09 上班 WORKDAY 星期一
2024-12-10 上班 WORKDAY 星期二
2024-12-11 上班 WORKDAY 星期三
2024-12-12 上班 WORKDAY 星期四
2024-12-13 上班 WORKDAY 星期五
2024-12-14 放假 WEEKEND 星期六
2024-12-15 放假 WEEKEND 星期日
2024-12-16 上班 WORKDAY 星期一
2024-12-17 上班 WORKDAY 星期二
2024-12-18 上班 WORKDAY 星期三
2024-12-19 上班 WORKDAY 星期四
2024-12-20 上班 WORKDAY 星期五
2024-12-21 放假 WEEKEND 星期六
2024-12-22 放假 WEEKEND 星期日
2024-12-23 上班 WORKDAY 星期一
2024-12-24 上班 WORKDAY 星期二
2024-12-25 上班 WORKDAY 星期三
2024-12-26 上班 WORKDAY 星期四
2024-12-27 上班 WORKDAY 星期五
2024-12-28 放假 WEEKEND 星期六
2024-12-29 放假 WEEKEND 星期日
2024-12-30 上班 WORKDAY 星期一
2024-12-31 上班 WORKDAY 星期二