四大區塊自上而下:
蔡勒公式變體:
(年 + 年/4 + 年/400 - 年/100 - 年基數 + 月基數 + 日) / 7 = ... 餘數即星期 註:除法取整。年基數:平年1、閏年2。月基數見下表。
| 月 | 平年 | 閏年 |
|---|---|---|
| 1 | 0 | 0 |
| 2 | 3 | 3 |
| 3 | 3 | 4 |
| 4 | 6 | 0 |
| 5 | 1 | 2 |
| 6 | 4 | 5 |
| 7 | 0 | 0 |
| 8 | 3 | 3 |
| 9 | 5 | 6 |
| 10 | 0 | 1 |
| 11 | 3 | 4 |
| 12 | 5 | 6 |
例:1949-10-1 → (1949+487+4-19-1+0+1)/7 = 345 餘 6 → 星期六。
boolean isLeap(int y) {
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
isLeap、firstDayOfMonth(year, month) 返回 1 日星期、daysInMonth(year, month) 返回天數。JPanel,持有年月狀態,refresh() 根據 SDate 計算重繪日期按鈕,註冊上一月/下一月/關閉事件。GridLayout(7,7) 佈局星期列+日期網格(首行星期)。JButton,當月正常顏色,非當月灰色,今日加粗邊框。refresh() 並 revalidate()/repaint()。Java 8+ 直接使用 java.time.YearMonth、LocalDate、DayOfWeek 替代手算,程式碼更簡潔且無 Bug。