自定義 View 的觸摸事件中每次調用 `calendar.get(Calendar.SECOND)` 獲取秒數,但多次觸摸得到的值不變,始終是第一次的時間。
// 錯誤用法:成員變量只初始化一次
Calendar calendar = Calendar.getInstance();
// 觸摸事件中
int sec = calendar.get(Calendar.SECOND); // 永遠是初始化那一刻的秒數
// 方案 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 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。