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

Android Calendar.getInstance() 多次調用返回同一時間的原因與正確用法

     編輯:程式設計疑難解答

問題現象

自定義 View 的觸摸事件中每次調用 `calendar.get(Calendar.SECOND)` 獲取秒數,但多次觸摸得到的值不變,始終是第一次的時間。

根本原因

// 錯誤用法:成員變量只初始化一次
Calendar calendar = Calendar.getInstance(); 

// 觸摸事件中
int sec = calendar.get(Calendar.SECOND); // 永遠是初始化那一刻的秒數
  • `Calendar.getInstance()` 返回**當前時刻的快照**,是一個**不可變**的時間點對象。
  • 該對象內部字段(年、月、日、時、分、秒)在創建瞬間確定,**不會隨系統時間自動更新**。
  • 後續調用 `get()` 只是讀取這個固定快照的字段值。

正確用法:每次使用時重新獲取實例

// 方案 1:每次調用獲取新實例(推薦,簡單)
public void onTouch(View v, MotionEvent event) {
    Calendar calendar = Calendar.getInstance(); // 關鍵:這裡 new
    int second = calendar.get(Calendar.SECOND);
    // 使用 second...
}

// 方案 2:若需高性能/高頻調用,用 System.currentTimeMillis()
long now = System.currentTimeMillis();
int second = (int)((now / 1000) % 60); // 計算當前秒數

// 方案 3:Java 8+ 使用 java.time (Android API 26+ 或啟用 core library desugaring)
LocalTime now = LocalTime.now(); // 不可變、線程安全、API 友好
int second = now.getSecond();

延伸:Calendar 實例復用的正確場景

若需對**同一時間點**進行多次字段讀取/運算(如格式化輸出年月日時分秒),則應復用實例:


Calendar cal = Calendar.getInstance(); // 固定某一時刻
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);
// ... 多次讀取同一快照,邏輯一致

總結

`Calendar` 是**時間點快照**,非**實時時鐘**。獲取當前時間必須每次調用 `Calendar.getInstance()` 或改用 `System.currentTimeMillis()` / `java.time` API。

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