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

Android Jetpack Compose DatePicker选中日期后显示为前一天问题

问题根因

日期差1天是时区不一致导致的:

  • MaterialDatePicker返回的选中日期时间戳是UTC时区当天0点的毫秒值
  • 原有代码里的SimpleDateFormat默认使用设备本地时区处理时间戳,当本地时区和UTC存在时差时就会出现日期偏移。比如UTC时区的2024-05-20 00:00:00,对应UTC-5时区的时间就是2024-05-19 19:00:00,就会显示为前一天的日期。

修复代码

只需修改DateFormater方法,指定格式化用UTC时区和日期选择器的返回值时区对齐即可:

fun DateFormater(milliseconds: Long?): String? {
    milliseconds?.let {
        val formatter = SimpleDateFormat("MM/dd/yyyy", Locale.US)
        // 新增时区指定逻辑
        formatter.timeZone = TimeZone.getTimeZone("UTC")
        val calendar: Calendar = Calendar.getInstance()
        calendar.timeInMillis = it
        return formatter.format(calendar.time)
    }
    return null
}

如果项目支持Java 8及以上,也可以用新的时间API避免旧版Calendar、SimpleDateFormat的时区坑:

fun DateFormater(milliseconds: Long?): String? {
    return milliseconds?.let {
        Instant.ofEpochMilli(it)
            .atZone(ZoneOffset.UTC)
            .format(DateTimeFormatter.ofPattern("MM/dd/yyyy", Locale.US))
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:48:00