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

EditText选择日期始终显示当前日期问题求助(附实现代码)

问题排查:DatePickerDialog选择日期后显示当前日期的解决方法

嘿,我一眼就瞅出你代码里的问题啦!咱们一步步来拆解:

问题根源

  1. 日期格式化用错了数据源:你在OnDateSetListener回调里,还是用了一开始创建的calendar实例(这个实例从始至终都是当前系统日期,根本没更新成用户选中的日期),所以etDob.setText()永远显示当前日期。
  2. 年龄校验逻辑也有坑:你创建userAge时用的year, month, day是初始的当前日期参数,不是用户通过DatePicker选中的日期(而且参数名重名了,很容易搞混!)。

修正后的完整代码

etDob.setOnClickListener {
    // 获取当前日期,变量名改成current开头,避免和回调里的参数重名
    val calendar = Calendar.getInstance()
    val currentYear = calendar.get(Calendar.YEAR)
    val currentMonth = calendar.get(Calendar.MONTH)
    val currentDay = calendar.get(Calendar.DAY_OF_MONTH)

    val dpd = DatePickerDialog(this, DatePickerDialog.OnDateSetListener { view, selectedYear, selectedMonth, selectedDay ->
        val myFormat: String = "MM/dd/yyyy"
        val sdf = SimpleDateFormat(myFormat, Locale.US)
        
        // 关键:用选中的日期创建新的Calendar实例,用来格式化
        val selectedCalendar = Calendar.getInstance()
        selectedCalendar.set(selectedYear, selectedMonth, selectedDay)
        val dob = sdf.format(selectedCalendar.getTime())
        etDob!!.setText(dob)

        // 修正年龄校验:用选中的日期来计算年龄
        val userAge = GregorianCalendar(selectedYear, selectedMonth, selectedDay)
        val minAdultAge = GregorianCalendar()
        minAdultAge.add(Calendar.YEAR, -18)
        
        // 注意:这里修正了判断逻辑,原逻辑写反了
        if (userAge.before(minAdultAge)) {
            Toast.makeText(this, "未满18岁", Toast.LENGTH_SHORT).show()
        } else {
            Toast.makeText(this, "已成年", Toast.LENGTH_SHORT).show()
        }
    }, currentYear, currentMonth, currentDay)
    
    dpd.datePicker.maxDate = Calendar.getInstance().timeInMillis
    dpd.show()
}

关键修改点说明

  • 日期显示修正:在回调里新建了selectedCalendar,把用户选中的selectedYear, selectedMonth, selectedDay设置进去,再用这个Calendar来格式化日期,这样etDob就会显示用户真正选的日期了。
  • 年龄校验修正:用回调传入的选中日期参数创建userAge,同时修正了判断逻辑——原代码的逻辑写反了,userAge.before(minAdultAge)才代表用户出生日期早于18年前,也就是未满18岁。
  • 变量名优化:把初始的当前日期变量改成currentYear这类名字,和回调里的selectedYear区分开,避免变量名重名导致的逻辑混乱。

内容的提问来源于stack exchange,提问作者V K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:27:35