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

DatePicker选择日期返回年日正确但月份始终为一月如何解决

问题原因

你代码中调用Calendar.set()方法时误用了日期字段:
你写的cal.set(Calendar.DAY_OF_YEAR, dayOfMonth)里,Calendar.DAY_OF_YEAR代表一年中的第几天,而非你预期的「当月的第几天」。
比如你选择6月20日,此时dayOfMonth返回值是20,你用DAY_OF_YEAR设置后,不管之前给月份设了什么值,Calendar都会自动把日期修正为当年的第20天,也就是1月20日,这就是你月份始终显示为1月的根本原因。

修复方案

只需要把Calendar.DAY_OF_YEAR替换为Calendar.DAY_OF_MONTH即可,修正后的监听代码如下:

val cal = Calendar.getInstance()
val dateSetListener =  DatePickerDialog.OnDateSetListener {
    view, year, monthOfYear, dayOfMonth ->
        cal.set(Calendar.YEAR, year)
        cal.set(Calendar.MONTH, monthOfYear)
        // 仅修改此处字段即可
        cal.set(Calendar.DAY_OF_MONTH, dayOfMonth)

        val format = "dd.MM.yyyy"
        val sdf = SimpleDateFormat(format,Locale.US)
        binding.test.text = sdf.format(cal.time)
        viewModel.updateDate(cal.timeInMillis)
}

binding.date.setOnClickListener {
    DatePickerDialog(
        requireContext(),
        R.style.ThemeOverlay_App_DatePicker,
        dateSetListener,
        cal.get(Calendar.YEAR),
        cal.get(Calendar.MONTH),
        cal.get(Calendar.DAY_OF_MONTH)
    ).show()
}

补充说明:你不用额外给monthOfYear加1,因为Calendar.MONTH本身就采用011对应112月的规则,SimpleDateFormat的MM格式符会自动把内部的月份值转换为常用的1~12月显示,这部分原有逻辑是正确的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:06:04