编辑代码

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.temporal.TemporalAdjusters;
import java.util.HashSet;
import java.util.Set;
import java.util.Scanner;

public class ChineseCalendar {

    private static final Set<LocalDate> HOLIDAYS = new HashSet<>();
    static {
        HOLIDAYS.add(LocalDate.of(2023, Month.JANUARY, 1));
        HOLIDAYS.add(LocalDate.of(2023, Month.JANUARY, 21));
        HOLIDAYS.add(LocalDate.of(2023, Month.JANUARY, 22));
        HOLIDAYS.add(LocalDate.of(2023, Month.JANUARY, 23));
        HOLIDAYS.add(LocalDate.of(2023, Month.JANUARY, 24));
        HOLIDAYS.add(LocalDate.of(2023, Month.JANUARY, 25));
        HOLIDAYS.add(LocalDate.of(2023, Month.JANUARY, 26));
        HOLIDAYS.add(LocalDate.of(2023, Month.JANUARY, 27));
        HOLIDAYS.add(LocalDate.of(2023, Month.APRIL, 5));
        HOLIDAYS.add(LocalDate.of(2023, Month.MAY, 1));
        HOLIDAYS.add(LocalDate.of(2023, Month.MAY, 2));
        HOLIDAYS.add(LocalDate.of(2023, Month.MAY, 3));
        HOLIDAYS.add(LocalDate.of(2023, Month.JUNE, 22));
        HOLIDAYS.add(LocalDate.of(2023, Month.SEPTEMBER, 29));
        HOLIDAYS.add(LocalDate.of(2023, Month.SEPTEMBER, 30));
        HOLIDAYS.add(LocalDate.of(2023, Month.OCTOBER, 1));
        HOLIDAYS.add(LocalDate.of(2023, Month.OCTOBER, 2));
        HOLIDAYS.add(LocalDate.of(2023, Month.OCTOBER, 3));
        HOLIDAYS.add(LocalDate.of(2023, Month.OCTOBER, 4));
        HOLIDAYS.add(LocalDate.of(2023, Month.OCTOBER, 5));
        HOLIDAYS.add(LocalDate.of(2023, Month.OCTOBER, 6));
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入年份:");
        int year = scanner.nextInt();
        System.out.print("请输入月份(1-12):");
        int month = scanner.nextInt();
        scanner.close();
        printCalendar(year, month);
    }
    private static void printCalendar(int year, int month) {
        LocalDate date = LocalDate.of(year, month, 1);
        Month currentMonth = date.getMonth();
        int daysInMonth = currentMonth.length(date.isLeapYear());
        System.out.println("\t\t" + year + "年" + month + "月");
        System.out.println("日\t一\t二\t三\t四\t五\t六");
        DayOfWeek firstDay = date.getDayOfWeek();
        int startIndex = firstDay.getValue() == 7 ? 0 : firstDay.getValue(); // 调整为周日=0,周一=1...
        for (int i = 0; i < startIndex; i++) {
            System.out.print("\t");
        }
        for (int day = 1; day <= daysInMonth; day++) {
            LocalDate currentDate = LocalDate.of(year, month, day);
            String dayStr = day + "";
            if (HOLIDAYS.contains(currentDate)) {
                dayStr = "\u001B[31m" + dayStr + "\u001B[0m"; // 红色
            } else if (firstDay == DayOfWeek.SATURDAY || firstDay == DayOfWeek.SUNDAY) {
                dayStr = "\u001B[34m" + dayStr + "\u001B[0m"; // 蓝色标注周末
            }

            System.out.print(dayStr + "\t");
            if (firstDay == DayOfWeek.SATURDAY || day == daysInMonth) {
                System.out.println();
                if (day != daysInMonth) {
                    firstDay = DayOfWeek.SUNDAY; // 下一行从周日开始
                }
            } else {
                firstDay = firstDay.plus(1);
            }
        }
    }
}