首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Calendar 月份陷阱:0-11 索引與 SimpleDateFormat 大小寫模式雙重陷阱

     編輯:程式設計綜合問答

現象描述

設置 `Calendar.MONTH = 4` (5月),輸出卻顯示 0月。`add(Calendar.MONTH, 3)` 從 0 開始加。

雙重陷阱解析

陷阱錯誤代碼正確代碼原因
Calendar 月份索引cal.set(Calendar.MONTH, 5)cal.set(Calendar.MONTH, 4) // 0-basedCalendar 月份 0-11 代表 1-12 月
SimpleDateFormat 模式大小寫"yyyy年mm月dd日""yyyy年MM月dd日" // 大寫 MMmm=分鐘,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 常量速查表


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

現代替代方案:Java 8+ java.time


// 強烈推薦:不可變、線程安全、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.MAY` 等常量,別寫魔法數字
  • ✅ 格式化月份用 `MM`(大寫),`mm` 是分鐘
  • ✅ 獲取月份給用戶看時 `+1`
  • ✅ 新項目直接用 `java.time.LocalDate`,拋棄 `Calendar`/`Date`

總結

兩個獨立錯誤疊加:`Calendar` 0-based 索引 + `SimpleDateFormat` `mm`/`MM` 大小寫敏感。Java 8+ `java.time` 徹底解決此類設計缺陷,**新代碼請直接使用 `LocalDate`/`LocalDateTime`**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved