DateField 組件概覽
javax.microedition.lcdui.DateField 是 Item 子類,專為日期/時間輸入設計,支援三種模式:
| 模式常量 | 顯示內容 | 適用場景 |
DateField.DATE | 年/月/日 | 生日、紀念日、排程日期 |
DateField.TIME | 時/分 (24H 或 12H 視裝置) | 鬧鐘、提醒時間、遊戲倒計時設定 |
DateField.DATE_TIME | 完整日期時間 | 行程安排、日誌記錄、訂單時間 |
完整實作範例
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class DateFieldDemo extends MIDlet implements CommandListener {
private Form form;
private DateField dateField;
private Command exitCmd, okCmd;
private Display display;
private Alert resultAlert;
public DateFieldDemo() {
form = new Form("日期時間測試");
// 建立 DATE_TIME 模式欄位
dateField = new DateField("設定日期時間:", DateField.DATE_TIME);
// 可選:設定初始值
// dateField.setDate(new Date());
form.append(dateField);
exitCmd = new Command("離開", Command.EXIT, 1);
okCmd = new Command("確定", Command.OK, 1);
form.addCommand(exitCmd);
form.addCommand(okCmd);
form.setCommandListener(this);
resultAlert = new Alert("結果", "", null, AlertType.INFO);
resultAlert.setTimeout(3000); // 3秒自動消失
}
protected void startApp() {
display = Display.getDisplay(this);
display.setCurrent(form);
}
protected void pauseApp() {}
protected void destroyApp(boolean unconditional) {}
public void commandAction(Command c, Displayable d) {
if (c == exitCmd) {
destroyApp(false);
notifyDestroyed();
} else if (c == okCmd) {
Date date = dateField.getDate(); // 取得 java.util.Date 物件
if (date != null) {
resultAlert.setString("選擇: " + date.toString());
} else {
resultAlert.setString("未選擇日期");
}
display.setCurrent(resultAlert, form);
}
}
}
核心 API 與資料流向
// 設定值 (java.util.Date)
dateField.setDate(new Date(System.currentTimeMillis()));
// 取得值 -> java.util.Date
Date selected = dateField.getDate();
// null 表示用戶清空欄位 (部分裝置支援)
// 格式化顯示 (需自行實作,Date.toString() 格式固定)
String formatted = formatDate(selected); // 見下方工具方法
日期格式化工具類 (J2ME 無 SimpleDateFormat)
public class DateUtil {
// 格式: yyyy-MM-dd HH:mm
public static String format(Date d) {
if (d == null) return "";
Calendar cal = Calendar.getInstance();
cal.setTime(d);
StringBuffer sb = new StringBuffer();
sb.append(cal.get(Calendar.YEAR)).append('-');
append2(sb, cal.get(Calendar.MONTH) + 1).append('-'); // 月份 0-based
append2(sb, cal.get(Calendar.DATE)).append(' ');
append2(sb, cal.get(Calendar.HOUR_OF_DAY)).append(':');
append2(sb, cal.get(Calendar.MINUTE));
return sb.toString();
}
private static StringBuffer append2(StringBuffer sb, int v) {
if (v < 10) sb.append('0');
sb.append(v);
return sb;
}
// 解析 "yyyy-MM-dd" -> Date
public static Date parseDate(String s) {
try {
int y = Integer.parseInt(s.substring(0, 4));
int m = Integer.parseInt(s.substring(5, 7)) - 1;
int d = Integer.parseInt(s.substring(8, 10));
Calendar cal = Calendar.getInstance();
cal.set(y, m, d, 0, 0, 0);
return cal.getTime();
} catch (Exception e) {
return null;
}
}
}
Calendar 關鍵常量提醒
| 常量 | 值範圍 | 注意 |
Calendar.YEAR | 完整年份 (如 2024) | |
Calendar.MONTH | 0-11 (0=1月, 11=12月) | 易錯點:比月份直覺少 1 |
Calendar.DATE / DAY_OF_MONTH | 1-31 | |
Calendar.HOUR_OF_DAY | 0-23 (24小時制) | |
Calendar.MINUTE | 0-59 | |
Calendar.DAY_OF_WEEK | 1-7 (1=星期日) | |
常見問題與解決
- 裝置不支援 DATE_TIME:部分低端機僅支援 DATE 或 TIME,建議啟動時檢測並降級。
getDate() 返回 null:用戶清空欄位或未輸入,需檢查 null。
- 時區問題:
Date 內部儲存 UTC 毫秒數,Calendar 使用裝置本地時區,跨時區傳輸時建議傳毫秒數 (d.getTime())。
- 輸入法差異:Nokia S40 彈出原生日期選擇器,S60 可能用鍵盤輸入,UI 風格不可控。