J2ME 時間處理涉及 System、Date、Calendar 三個類別,各有適用場景。本文整理三者轉換、常用操作與月份陷阱注意事項。
| 類別/方法 | 表示形式 | 適用場景 |
|---|---|---|
System.currentTimeMillis() | long 毫秒數(GMT 1970/1/1 起) | 時間差計算、時間戳記、排序比較 |
new Date() | Date 物件 | 簡單顯示、序列化、RMS 儲存 |
Calendar.getInstance() | Calendar 物件 | 日期運算、欄位擷取(年/月/日/週)、格式化 |
// 1. long -> Date
Date date = new Date(System.currentTimeMillis());
// 2. Date -> Calendar
Calendar cal = Calendar.getInstance();
cal.setTime(date);
// 3. Calendar -> Date
Date date2 = cal.getTime();
// 4. Calendar -> long
long ms = cal.getTimeInMillis(); // CLDC 1.1+ / MIDP 2.0+
// 或
long ms = cal.getTime().getTime();
Calendar cal = Calendar.getInstance(); // 目前時間
// 擷取欄位
int year = cal.get(Calendar.YEAR); // 年(如 2024)
int month = cal.get(Calendar.MONTH); // 月:0=1月, 11=12月 ⚠️ 陷阱!
int day = cal.get(Calendar.DATE); // 日(1~31)
int hour = cal.get(Calendar.HOUR_OF_DAY); // 時(0~23)
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
int dow = cal.get(Calendar.DAY_OF_WEEK); // 星期:1=Sunday, 7=Saturday
// 日期運算
cal.add(Calendar.DATE, 7); // 加 7 天
cal.add(Calendar.MONTH, -1); // 減 1 月
cal.set(Calendar.YEAR, 2025); // 設定年份
// 格式化輸出(需自行組合)
String formatted = cal.get(Calendar.YEAR) + "/" +
(cal.get(Calendar.MONTH)+1) + "/" +
cal.get(Calendar.DATE);
Calendar.JANUARY = 0,Calendar.DECEMBER = 11。
顯示給使用者時 必須 +1;解析使用者輸入時 必須 -1。
long 毫秒數,跨平台、跨時區最安全Date.toString() 格式因實作而異,不可依賴解析Calendar 無時區 API,預設為裝置本地時間。跨時區應用需自行維護偏移量Calendar.getInstance() 較重,避免在高頻迴圈/繪圖中呼叫