直接使用 Calendar.getInstance() 獲取時間,輸出往往為 GMT 時間,而非手機本地時間 (如北京時間 GMT+8)。
SimpleTimeZone 等子類,不可自行實例化具體時區對象。// 1. 獲取設備默認時區 (由廠商根據 SIM/網絡/設置決定)
TimeZone defaultZone = TimeZone.getDefault();
// 2. 獲取該時區與 GMT 的原始偏移量 (毫秒)
int offset = defaultZone.getRawOffset(); // 北京時間應為 8*3600*1000 = 28800000
// 3. 獲取時區 ID
String id = defaultZone.getID(); // 如 "GMT+08:00" 或廠商自定義 ID
// 4. 列出設備支持的所有時區 ID
String[] ids = TimeZone.getAvailableIDs();
TimeZone tz = TimeZone.getDefault(); // 或 getTimeZone("GMT+08:00") 若確定
Calendar cal = Calendar.getInstance(tz);
String localTime = cal.getTime().toString(); // 現在應輸出本地時間
| 誤區 | 正確做法 |
|---|---|
假設 TimeZone.getTimeZone("GMT+08:00") 總能返回正確對象 |
僅當設備支持該 ID 時有效;首選 getDefault() 由廠商決定 |
直接用 Calendar.getInstance() 即為本地時間 |
默認構造常使用 GMT;必須顯式傳入 TimeZone.getDefault() |
| 水貨/灰市手機時區不準 | 時區由廠商實現讀取 SIM/網絡/用戶設置,與貨源無關;實測為準 |
| 想手動設置時區 | J2ME 無 API 設置系統時區;只能在應用層邏輯中手動加減偏移量 |
getDefault().getID() 和 getRawOffset(),上傳服務器分析用戶分佈。System.currentTimeMillis() (本質為 UTC),客戶端按本地時區格式化顯示。getAvailableIDs() 支持程度不同,部分低端機型僅返回少量 ID。J2ME 獲取本地時間的關鍵在於 TimeZone.getDefault() → Calendar.getInstance(tz)。廠商實現決定了準確性,開發者只需正確調用 API,並在應用層統一使用 UTC 時間戳傳輸、本地時區顯示。