設置 `Calendar.MONTH = 4` (5月),輸出卻顯示 0月。`add(Calendar.MONTH, 3)` 從 0 開始加。
| 陷阱 | 錯誤代碼 | 正確代碼 | 原因 |
|---|---|---|---|
| Calendar 月份索引 | cal.set(Calendar.MONTH, 5) | cal.set(Calendar.MONTH, 4) // 0-based | Calendar 月份 0-11 代表 1-12 月 |
| SimpleDateFormat 模式大小寫 | "yyyy年mm月dd日" | "yyyy年MM月dd日" // 大寫 MM | mm=分鐘,MM=月份 |
Calendar cal = Calendar.getInstance();
// 設置為 2023年5月20日
cal.set(2023, Calendar.MAY, 20); // 推薦用常量 Calendar.MAY=4
// 或
cal.set(2023, 4, 20); // 月份 0-based
// 正確格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
System.out.println(sdf.format(cal.getTime())); // 2023年05月20日
// 月份運算
cal.add(Calendar.MONTH, 3); // 增加 3 個月 → 8月
System.out.println(sdf.format(cal.getTime())); // 2023年08月20日
// 獲取月份(顯示給用戶時 +1)
int displayMonth = cal.get(Calendar.MONTH) + 1;
System.out.println("當前月份: " + displayMonth); // 8
Calendar.JANUARY = 0 Calendar.JULY = 6
Calendar.FEBRUARY = 1 Calendar.AUGUST = 7
Calendar.MARCH = 2 Calendar.SEPTEMBER = 8
Calendar.APRIL = 3 Calendar.OCTOBER = 9
Calendar.MAY = 4 Calendar.NOVEMBER = 10
Calendar.JUNE = 5 Calendar.DECEMBER = 11
// 強烈推薦:不可變、線程安全、API清晰
LocalDate date = LocalDate.of(2023, Month.MAY, 20);
System.out.println(date.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")));
LocalDate threeMonthsLater = date.plusMonths(3);
int month = threeMonthsLater.getMonthValue(); // 直接返回 1-12,無需 +1
兩個獨立錯誤疊加:`Calendar` 0-based 索引 + `SimpleDateFormat` `mm`/`MM` 大小寫敏感。Java 8+ `java.time` 徹底解決此類設計缺陷,**新代碼請直接使用 `LocalDate`/`LocalDateTime`**。