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

J2ME DateField 組件實戰:日期時間輸入與格式化顯示

     編輯:J2ME

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.MONTH0-11 (0=1月, 11=12月)易錯點:比月份直覺少 1
Calendar.DATE / DAY_OF_MONTH1-31
Calendar.HOUR_OF_DAY0-23 (24小時制)
Calendar.MINUTE0-59
Calendar.DAY_OF_WEEK1-7 (1=星期日)

常見問題與解決

  • 裝置不支援 DATE_TIME:部分低端機僅支援 DATE 或 TIME,建議啟動時檢測並降級。
  • getDate() 返回 null:用戶清空欄位或未輸入,需檢查 null。
  • 時區問題:Date 內部儲存 UTC 毫秒數,Calendar 使用裝置本地時區,跨時區傳輸時建議傳毫秒數 (d.getTime())。
  • 輸入法差異:Nokia S40 彈出原生日期選擇器,S60 可能用鍵盤輸入,UI 風格不可控。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved