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

Kotlin/Java中LocalDate转Long适配MaterialDatePicker日期少一天如何解决?

问题原因

MaterialDatePicker 的setSelection方法要求传入的时间戳基准为UTC时区对应日期零点的毫秒值,你原有转换逻辑使用本地时区(当前为GMT+03:00莫斯科时区)生成零点时间戳,时区基准不匹配导致日期识别偏差。

对应你的日志数据验证:

  • 你要设置的2021-11-30对应UTC零点时间戳为1638230400000,和日志中MaterialDatePicker.todayInUtcMilliseconds()输出一致
  • 你转换得到的1638219600000是莫斯科时区2021-11-30 00:00:00的时间戳,转换为UTC时间为2021-11-29 21:00:00,MaterialDatePicker按UTC基准识别自然返回11月29日,和你遇到的现象完全吻合。
修复方案

将LocalDate转时间戳时指定UTC为基准时区即可,修改后代码如下:

val formatter = DateTimeFormatter.ofPattern(DAY_FORMAT_PATTERN)
val selectedDate = LocalDate.parse(viewModel.selectedDateStateFlow.value, formatter)
// 核心修改:指定UTC时区生成零点时间戳
val selectedDateToLong = selectedDate.atStartOfDay(ZoneOffset.UTC)
    .toInstant()
    .toEpochMilli()

val datePicker = MaterialDatePicker.Builder.datePicker()
    .setTheme(R.style.DatePicker)
    .setSelection(selectedDateToLong)
    .build()
补充说明

如果后续需要把MaterialDatePicker返回的选中时间戳转回本地日期,参考如下转换逻辑:

val pickedUtcTimestamp = datePicker.selection ?: return
val pickedLocalDate = Instant.ofEpochMilli(pickedUtcTimestamp)
    .atZone(ZoneId.systemDefault())
    .toLocalDate()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:54:01