J2ME (CLDC/MIDP) 時間處理涉及 System、Date、Calendar 三大類別,兩種時間表達方式(毫秒長整數與物件模型)。本文系統整理轉換技巧與常用日期運算。
Date、Calendar 物件,適合顯示、欄位擷取、日期運算| 類別 | 關鍵方法 | 用途 |
|---|---|---|
System | currentTimeMillis() | 取得當前毫秒時間戳(長整數) |
java.util.Date | new Date()new Date(long ms)getTime() | 日期物件建構、毫秒值互轉 |
java.util.Calendar | getInstance()get(field)setTime(Date)add(field, amount) | 日期欄位存取、運算、與 Date 互轉 |
Date date = new Date(System.currentTimeMillis());
Calendar calendar = Calendar.getInstance();
Date date = new Date();
calendar.setTime(date);
Date date = calendar.getTime();
long ms = date.getTime(); // 或 calendar.getTimeInMillis() (J2SE)
Calendar cal = Calendar.getInstance();
// 取得當前日期資訊
int year = cal.get(Calendar.YEAR); // 年
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 min = cal.get(Calendar.MINUTE); // 分
int sec = cal.get(Calendar.SECOND); // 秒
int dow = cal.get(Calendar.DAY_OF_WEEK); // 星期:1=星期日, 7=星期六
⚠️ 關鍵陷阱: Calendar.MONTH 以 0 起始(0=一月,11=十二月),顯示時需 +1;DAY_OF_WEEK 以 1 起始(1=星期日)。
// 日期加減(會連帶改變月份/年份)
cal.add(Calendar.DATE, 10); // 10 天後
cal.add(Calendar.MONTH, -1); // 1 個月前
cal.add(Calendar.YEAR, 1); // 1 年後
// 單一欄位滾動(不改變較大單位)
cal.roll(Calendar.DATE, 5); // 日 +5,超過月份不進位
cal.roll(Calendar.MONTH, 2); // 月 +2,不改變年份
J2ME 無 SimpleDateFormat,需手動拼裝或使用 DateFormat(MIDP 2.0+):
// MIDP 2.0 標準格式化
import javax.microedition.lcdui.DateFormat;
String formatted = DateFormat.format(cal.getTime()); // 依區域設定
// 手動拼裝範例
String manual = cal.get(Calendar.YEAR) + "-" +
(cal.get(Calendar.MONTH) + 1) + "-" +
cal.get(Calendar.DATE) + " " +
cal.get(Calendar.HOUR_OF_DAY) + ":" +
cal.get(Calendar.MINUTE);
public static long daysBetween(Date d1, Date d2) {
long ms1 = d1.getTime();
long ms2 = d2.getTime();
long diffMs = Math.abs(ms1 - ms2);
return diffMs / (24 * 60 * 60 * 1000); // 毫秒轉天
}