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"
}
}
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));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。SimpleDateFormat,格式化需自行實作或引入輕量第三方庫。Calendar.getInstance() 而非長期持有實例。掌握 Calendar 基本用法與時區陷阱,即可在 J2ME 中可靠處理日期時間顯示需求。