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

J2ME 取得系統時間並格式化為字串(兼容 WTK 時區差異)

     編輯:J2ME

J2ME 的 java.util.Calendar 為抽象類別,提供日期時間欄位存取。本文示範如何取得當前年月日並格式化為 yyyyMMdd 字串,同時說明 WTK 模擬器與真機因時區預設值不同導致的 8 小時落差問題。

核心程式碼

import java.util.Calendar;
import java.util.TimeZone;

public class DateUtil {
    public static String getCurrentDateString() {
        TimeZone tz = TimeZone.getDefault(); // 取得系統預設時區
        Calendar cal = Calendar.getInstance(tz); // 以當前時間初始化

        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH) + 1; // 0-based → 1-based
        int day = cal.get(Calendar.DATE);

        // 手動補零格式化
        StringBuilder sb = new StringBuilder();
        sb.append(year);
        if (month < 10) sb.append('0');
        sb.append(month);
        if (day < 10) sb.append('0');
        sb.append(day);
        return sb.toString(); // 例如 "20070904"
    }
}

WTK 時區陷阱

  • 現象: 在 WTK 模擬器執行上述程式碼,輸出日期可能比真機/系統時間相差 8 小時(導致日期前後一天)。
  • 原因: WTK 預設時區常為 GMT/UTC,而真機依 SIM 卡或網路自動設為本地時區(如 GMT+8)。
  • 對策:
    1. 真機測試為準,忽略模擬器日期差異。
    2. 若需在模擬器模擬真機時區,可在程式啟動時強制設定:
      TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
    3. 或於 WTK 安裝目錄 bin/kvm.exe 啟動參數加入 -Duser.timezone=GMT+8(視版本支援度而定)。

擴充:完整日期時間格式化

public static String formatDateTime(Calendar cal, String pattern) {
    // pattern 範例: "yyyy-MM-dd HH:mm:ss"
    // J2ME 無 SimpleDateFormat,需自行實作簡易替換
    String s = pattern;
    s = replace(s, "yyyy", String.valueOf(cal.get(Calendar.YEAR)));
    s = replace(s, "MM", twoDigits(cal.get(Calendar.MONTH)+1));
    s = replace(s, "dd", twoDigits(cal.get(Calendar.DATE)));
    s = replace(s, "HH", twoDigits(cal.get(Calendar.HOUR_OF_DAY)));
    s = replace(s, "mm", twoDigits(cal.get(Calendar.MINUTE)));
    s = replace(s, "ss", twoDigits(cal.get(Calendar.SECOND)));
    return s;
}
private static String twoDigits(int v) { return (v<10?"0":"")+v; }
private static String replace(String src, String k, String v) {
    int idx = src.indexOf(k);
    return (idx>=0) ? src.substring(0,idx)+v+src.substring(idx+k.length()) : src;
}

注意事項

  • Calendar.MONTH 為 0-11,取值時務必 +1。
  • J2ME 無 SimpleDateFormat,格式化需自行實作或引入輕量第三方庫。
  • 長時間運行的 MIDlet 若需即時更新顯示,建議每分鐘重新取得 Calendar.getInstance() 而非長期持有實例。

掌握 Calendar 基本用法與時區陷阱,即可在 J2ME 中可靠處理日期時間顯示需求。

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