You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:如何合并选中时分与当前时间对比并设置TimePickerDialog默认时间

问题解决办法

一、修复TimePickerDialog默认显示当前时间的问题

你代码中已经传递了当前时间的小时和分钟参数,但原代码里calendar变量未初始化(int currHour = calendar.get(Calendar.HOUR_OF_DAY);这行),这会导致运行报错,影响对话框的正常显示。确保每次点击按钮时,都基于当前时间创建对话框实例,参数传递正确即可解决。

二、修复时间过期判断的错误(Time类报错)

Android的Time类已被废弃,且你使用的构造方法不正确,改用Calendar类来处理时间比较是更稳妥的方案,以下是修改后的完整代码:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Calendar currentTime = Calendar.getInstance();
        timePickerDialog = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                // 构建用户选择的时间实例
                Calendar selectedTime = Calendar.getInstance();
                selectedTime.set(Calendar.HOUR_OF_DAY, hourOfDay);
                selectedTime.set(Calendar.MINUTE, minute);
                // 清零秒和毫秒,避免秒数差异导致误判
                selectedTime.set(Calendar.SECOND, 0);
                selectedTime.set(Calendar.MILLISECOND, 0);
                
                Calendar now = Calendar.getInstance();
                now.set(Calendar.SECOND, 0);
                now.set(Calendar.MILLISECOND, 0);

                if (selectedTime.before(now)) {
                    Toast.makeText(getApplicationContext(), "该时间已过期,请选择当前或之后的时间", Toast.LENGTH_LONG).show();
                    return; // 终止后续保存逻辑
                }

                // 格式化时间为两位数格式
                String formattedTime = String.format("%02d:%02d", hourOfDay, minute);

                // 执行预约保存操作
                Userbook book = new Userbook(temp, formattedTime);
                db.collection("Booking").add(book)
                        .addOnSuccessListener(documentReference -> 
                                Toast.makeText(MainActivity.this, "预约已保存", Toast.LENGTH_SHORT).show())
                        .addOnFailureListener(e -> 
                                Toast.makeText(MainActivity.this, "保存失败:" + e.getMessage(), Toast.LENGTH_SHORT).show());

                Toast.makeText(MainActivity.this, "选择的时间:" + formattedTime, Toast.LENGTH_SHORT).show();
            }
        }, currentTime.get(Calendar.HOUR_OF_DAY), currentTime.get(Calendar.MINUTE), false);
        timePickerDialog.show();
    }
});

核心修改说明:

  • 移除废弃的Time类,改用Calendar处理时间比较,避免API兼容问题
  • 对选择的时间和当前时间的秒、毫秒清零,防止因秒数差异导致的误判(比如当前10:05:30,用户选10:05不会被判定为过期)
  • 时间过期时直接终止后续逻辑,避免无效数据存入数据库
  • 优化时间格式化,保证显示格式统一(如09:05而非9:5)

额外提示

  • 若timePickerDialog为全局变量,每次创建前可先判断是否已显示,避免重复弹窗:
    if (timePickerDialog != null && timePickerDialog.isShowing()) {
        timePickerDialog.dismiss();
    }
    

内容的提问来源于stack exchange,提问作者Haziq Mt Roslan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:31:01