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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:40:37