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
相关产品推荐
相关产品推荐

