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

Android Calendar 獲取日期錯誤:常量 vs 方法混淆

     編輯:程式設計綜合問答

錯誤代碼

Calendar c = Calendar.getInstance();
Toast.makeText(this, " " + c.DAY_OF_MONTH + " " + c.MONTH + " " + c.YEAR, Toast.LENGTH_LONG).show();
// 輸出:5 2 1 (而非預期的 17 4 2013)

根本原因

c.DAY_OF_MONTH、c.MONTH、c.YEAR 是 Calendar 類的靜態常量(int 值),分別為 5、2、1,代表欄位索引,而非當前日期數值。

正確寫法:調用 get() 方法

Calendar c = Calendar.getInstance();
int day = c.get(Calendar.DAY_OF_MONTH);   // 17
int month = c.get(Calendar.MONTH);        // 3 (0-based,4月)
int year = c.get(Calendar.YEAR);          // 2013

// 月份需 +1 顯示
String dateStr = String.format("%02d-%02d-%04d", day, month + 1, year);
Toast.makeText(this, dateStr, Toast.LENGTH_LONG).show();
// 輸出:17-04-2013

關鍵知識點

常量值含義
Calendar.DAY_OF_MONTH5欄位索引:日
Calendar.MONTH2欄位索引:月(0-11)
Calendar.YEAR1欄位索引:年

現代替代方案:java.time (API 26+ / ThreeTenABP)

// Java 8+ / Android API 26+
LocalDate now = LocalDate.now();
String formatted = now.format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
// 或
int day = now.getDayOfMonth();
int month = now.getMonthValue(); // 1-12
int year = now.getYear();

優點:不可變、執行緒安全、API 直觀、無 0-based 月份陷阱。

避坑清單

  • ❌ c.DAY_OF_MONTH → ✅ c.get(Calendar.DAY_OF_MONTH)
  • ❌ c.MONTH 直接顯示 → ✅ c.get(Calendar.MONTH) + 1
  • ❌ new Date() 格式化 → ✅ SimpleDateFormat / DateTimeFormatter
  • ⚠️ Calendar.getInstance() 使用預設時區/語言環境 → 指定 TimeZone / Locale 若需國際化
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved