Kotlin日期选择器格式修改:将1.7.2023改为01.07.2023
问题:将DatePicker输出日期改为两位数格式(01.07.2023)
我编写了一段绑定至EditText的Kotlin DatePicker代码,该代码可正常运行,但输出日期格式为1.7.2023,需要将其改为01.07.2023格式。原代码如下:
lateinit var dateEdt: EditText @RequiresApi(Build.VERSION_CODES.O) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_change) dateEdt = findViewById(R.id.date1) dateEdt.setOnClickListener { var c = Calendar.getInstance() var day = c.get(Calendar.DAY_OF_MONTH) var month = c.get(Calendar.MONTH) var year = c.get(Calendar.YEAR) val datePickerDialog = DatePickerDialog( this, { view, year, monthOfYear, dayOfMonth -> val dat = (dayOfMonth.toString() + "." + (monthOfYear + 1) + "." + year) // 原代码未将日期设置到EditText,需补充setText逻辑 }, year, month, day ) datePickerDialog.show() } }
我尝试了以下几种方法均未生效:
无效代码1
if(month < 10){ month = "0" + month; } if(day < 10){ day = "0" + day ; } searchText.setText(day + "-" + month + "-" + year);
无效代码2
Date d = new Date(year, month, day); SimpleDateFormat dateFormatter = new SimpleDateFormat( "MM-dd-yyyy hh:mm"); dateEdt = dateFormatter.format(d);
无效代码3
calendar.set(year, month, day); SimpleDateFormat format = new SimpleDateFormat("MM-dd-yyyy"); String dateEdt = format.format(calendar.getTime());
解决方案
方法一:Kotlin字符串补零(简单直接)
在DatePickerDialog的回调中,使用padStart方法给日、月补零,确保输出为两位数:
val datePickerDialog = DatePickerDialog( this, { view, year, monthOfYear, dayOfMonth -> // 日补零:长度不足2时在开头加0 val dayStr = dayOfMonth.toString().padStart(2, '0') // 月补零:注意月份要+1(DatePicker返回的月份从0开始) val monthStr = (monthOfYear + 1).toString().padStart(2, '0') val formattedDate = "$dayStr.$monthStr.$year" // 将格式化后的日期设置到EditText dateEdt.setText(formattedDate) }, year, month, day )
padStart(2, '0')的作用是:如果字符串长度小于2,自动在开头填充'0',比如1转为"01",7转为"07"。
方法二:使用现代日期API(推荐)
因为代码标注了@RequiresApi(Build.VERSION_CODES.O),可以直接用Java 8引入的LocalDate和DateTimeFormatter,避免旧API的兼容性问题:
val datePickerDialog = DatePickerDialog( this, { view, year, monthOfYear, dayOfMonth -> // 构建LocalDate:月份参数从1开始,直接传入monthOfYear+1 val localDate = LocalDate.of(year, monthOfYear + 1, dayOfMonth) // 定义格式:dd=两位数日,MM=两位数月,yyyy=四位年 val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy") val formattedDate = localDate.format(formatter) dateEdt.setText(formattedDate) }, year, month, day )
无效代码问题分析
- 无效代码1:变量类型不匹配,
month和day是Int类型,直接赋值字符串会编译报错;且代码未放在DatePicker回调逻辑中,根本不会执行。 - 无效代码2:使用了过时的
Date构造方法,且错误地将格式化字符串直接赋值给EditText变量(dateEdt是EditText实例,不是String),应调用setText();格式字符串MM-dd-yyyy也不符合需求的dd.MM.yyyy格式。 - 无效代码3:同样错误地将字符串赋值给EditText变量,未调用
setText();Calendar的月份参数从0开始,未加1会导致月份少一个月;格式分隔符是-而非.,不符合需求。
内容的提问来源于stack exchange,提问作者Yurgen Hunter
相关产品推荐
相关产品推荐

