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

Java Calendar月份陷阱:get(Calendar.MONTH)返回值需+1的原因與最佳實踐

     編輯:程式設計綜合問答

問題現象

Calendar c = Calendar.getInstance();
int month = c.get(Calendar.MONTH); // 今天是 12 月,輸出 11

根本原因

Calendar.MONTH 為 0 基索引:

  • January = 0
  • February = 1
  • ...
  • December = 11

設計初衷:便於數組索引,如 `monthNames[cal.get(Calendar.MONTH)]`。

正確使用

int month = c.get(Calendar.MONTH) + 1; // 1-12
int year = c.get(Calendar.YEAR);
int day = c.get(Calendar.DAY_OF_MONTH); // 1-31

現代替代方案:java.time (JDK 8+)

import java.time.LocalDate;
import java.time.Month;

LocalDate today = LocalDate.now();
int year = today.getYear();           // 2024
int month = today.getMonthValue();    // 1-12 (直觀!)
Month monthEnum = today.getMonth();   // DECEMBER (枚舉類型安全)
int day = today.getDayOfMonth();      // 1-31

// 格式化輸出
String formatted = today.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")); // 2024年12月28日

對比優勢

遷移建議

  • 新項目**直接使用 `java.time`**
  • 舊項目逐步替換:`Calendar` → `ZonedDateTime`/`LocalDateTime`
  • 數據庫交互:JDBC 4.2+ 支持 `setObject/getObject` 直接處理 `LocalDate`
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性CalendarLocalDate
月份索引0-11 (易錯)1-12 (直觀)
線程安全非線程安全不可變,線程安全
API 設計Getter/Setter 混雜流式、不可變
時區處理隱式默認時區顯式 `ZonedDateTime`
格式化SimpleDateFormat (非線程安全)DateTimeFormatter (線程安全)