輸入年、月,輸出標準日曆格式。核心難點:計算任意月 1 號是星期幾。
public class PerpetualCalendar {
// 1. 閏年判斷
public static boolean isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 2. 獲取月份天數
public static int getMonthDays(int year, int month) {
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31;
case 4: case 6: case 9: case 11: return 30;
case 2: return isLeapYear(year) ? 29 : 28;
default: throw new IllegalArgumentException("無效月份: " + month);
}
}
// 3. 計算總天數(1970-01-01 到 year-month-01)
public static int calculateTotalDays(int year, int month) {
int days = 0;
// 年天數
for (int y = 1970; y < year; y++) {
days += isLeapYear(y) ? 366 : 365;
}
// 月天數
for (int m = 1; m < month; m++) {
days += getMonthDays(year, m);
}
return days;
}
// 4. 打印標題
public static void printTitle(int year, int month) {
System.out.println("============================");
System.out.println(" " + year + "年" + month + "月");
System.out.println("============================");
System.out.println("日 一 二 三 四 五 六");
}
// 5. 打印日曆主體
public static void printCalendar(int year, int month) {
int totalDays = calculateTotalDays(year, month);
int firstWeekDay = (totalDays + 4) % 7; // 1號星期幾
int monthDays = getMonthDays(year, month);
// 打印 1 號前空格
for (int i = 0; i < firstWeekDay; i++) {
System.out.print(" ");
}
// 打印日期
for (int day = 1; day <= monthDays; day++) {
System.out.printf("%2d ", day);
if ((firstWeekDay + day) % 7 == 0) {
System.out.println();
}
}
System.out.println("\n");
}
public static void main(String[] args) {
// 測試
printTitle(2024, 2);
printCalendar(2024, 2); // 閏年 2 月
printTitle(2024, 1);
printCalendar(2024, 1);
printTitle(2023, 2);
printCalendar(2023, 2); // 平年 2 月
}
}
============================
2024年2月
============================
日 一 二 三 四 五 六
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29
============================
2024年1月
============================
日 一 二 三 四 五 六
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
java.time API(Java 8+)簡化:LocalDate.of(year, month, 1).getDayOfWeek()java.time)替代手工計算