Android Kotlin DatePicker无法选未来日期、日期为个位数求YYYY-MM-DD格式方案
问题修复方案
核心错误点
- 限制未来日期选择:代码中
datePicker!!.datePicker.maxDate = c.timeInMillis手动设置了日期选择器的最大可选日期为当前时间,删除该行即可放开未来日期选择。 - 日期格式与赋值错误:
- 格式化字符串使用
%02d才能实现不足两位时补前导0,你用的%2d只会补空格不会补0 - 赋值时变量引用错误:回调返回的选中日期是
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
相关产品推荐
相关产品推荐

