類 `CalendarV2` 繼承 `Applet`,兼容獨立運行(`main` 方法啟動 `Frame`)。核心組件:
public boolean checkLeapYear(int year) {
if (year % 4 == 0 && year % 100 != 0) return true;
if (year % 400 == 0) return true;
return false;
}
標準格里曆規則,邏輯正確。
public int counterYearDates(int targetYear) {
if (targetYear == 2001) return 0; // 基準年
if (targetYear > 2001)
return checkYear(targetYear - 1) + counterYearDates(targetYear - 1);
else
return checkYear(targetYear) + counterYearDates(targetYear + 1);
}
遞歸深度 = |目標年 - 2001|,年份跨度大時棧溢出風險。**建議改為迭代循環**。
public int[] Array(int allDates, int month) {
int n = allDates % 7; // 1號星期偏移
if (n < 0) n = 7 + n + 1; // 修正負數
int[] table = new int[38]; // 6行×7列=42,留邊界
// 填充日期...
return table;
}
輸出為 38 長度數組,控制台打印邏輯處理換行對齊。
| 方案 | 適用場景 | 核心技術 | 遷移成本 |
|---|---|---|---|
| Swing 桌面應用 | 內部工具、教學演示 | JFrame + JTable/JCalendar 組件 | 低(邏輯復用,組件替換) |
| JavaFX 桌面應用 | 現代桌面、需豐富 UI | FXML + DatePicker / CalendarView | 中(需學習 JavaFX 體系) |
| Web 應用 (Spring Boot + Vue/React) | 互聯網項目、跨平台訪問 | REST API + 前端日曆組件 | 高(架構重寫) |
| Android App | 移動端原生 | MaterialDatePicker / CalendarView | 高(平台遷移) |
YearMonth ym = YearMonth.of(year, month);
int days = ym.lengthOfMonth(); // 自動處理閏年
DayOfWeek firstDay = ym.atDay(1).getDayOfWeek(); // 1號星期
// 直接計算偏移填充 JTable
public int daysBetweenYears(int baseYear, int targetYear) {
int sum = 0;
if (targetYear > baseYear) {
for (int y = baseYear; y < targetYear; y++) sum += isLeap(y) ? 366 : 365;
} else {
for (int y = targetYear; y < baseYear; y++) sum -= isLeap(y) ? 366 : 365;
}
return sum;
}
O(1) 空間,無棧溢出風險,性能更優。
Applet 早已被瀏覽器廢棄(JDK 9 移除),此代碼僅具教學參考價值。**核心日期算法(閏年、月長、星期對齊)是永恆的**,剝離後可無縫遷移至任何現代 UI 技術棧。建議開發者建立 `CalendarUtils` 工具類,沉澱日期計算邏輯,前端技術怎麼變,後端算法穩如磐石。