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
相关产品推荐
相关产品推荐

