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

Android Kotlin DatePicker无法选未来日期、日期为个位数求YYYY-MM-DD格式方案

问题修复方案

核心错误点

  • 限制未来日期选择:代码中datePicker!!.datePicker.maxDate = c.timeInMillis手动设置了日期选择器的最大可选日期为当前时间,删除该行即可放开未来日期选择。
  • 日期格式与赋值错误:
    1. 格式化字符串使用%02d才能实现不足两位时补前导0,你用的%2d只会补空格不会补0
    2. 赋值时变量引用错误:回调返回的选中日期是dayOfMonth、month、year三个参数,你错误地用了初始化时全局的day变量给天、年的TextView赋值,导致展示的值完全错误。

修正后的Kotlin代码

class MainActivity : AppCompatActivity() {
    var datePicker: DatePickerDialog? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val c = Calendar.getInstance()
        val year = c.get(Calendar.YEAR)
        val month = c.get(Calendar.MONTH)
        val day = c.get(Calendar.DAY_OF_MONTH)

        calen_box.setOnClickListener {
            datePicker =  DatePickerDialog(this, DatePickerDialog.OnDateSetListener { view: DatePicker?, selectedYear: Int, selectedMonth: Int, selectedDay: Int ->
                // 分别给三个控件赋值,自动补前导0
                daytext.setText(String.format("%02d", selectedDay))
                monthtext.setText(String.format("%02d", (selectedMonth+1)))
                yeartext.setText(String.format("%d", selectedYear))
                
                // 直接获取YYYY-MM-DD格式的完整日期,直接使用该变量即可
                val fullDate = String.format("%d-%02d-%02d", selectedYear, selectedMonth+1, selectedDay)
            }, year, month, day)
            // 删掉限制最大日期的这行即可选择未来日期
            // datePicker!!.datePicker.maxDate = c.timeInMillis
            datePicker!!.show()
        }
    }
}

补充说明

如果你的项目minSdk版本>=26,更推荐用LocalDateTime相关的API做日期格式化,不需要手动处理月份+1的逻辑,出错概率更低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:54:02