我的 DatePicker 和 LocalDate 时间戳转换有问题
打开 DatePicker 时,我选择一天,并在确认后将时间戳转换为 LocalDate 并存储在一个值中。
打开 DatePicker 时,我想将 LocalDate 转换为时间戳,并在 DatePicker 中初始选择这一天。
现在的问题是,保存的 LocalDate 是正确的。但是在DatePicker中设置初始日期的加载日期是休息一天。它比 LocalDate 的实际日期早一天。
CustomDatePicker 只是标准 DatePicker 的包装。
DatePicker(state = datePickerState)
fun convertTimestampToLocalDate(timestamp: Long, timeZone: ZoneId = ZoneId.systemDefault()): LocalDate {
return Instant.ofEpochMilli(timestamp)
.atZone(timeZone)
.toLocalDate()
}
fun convertLocalDateToTimestamp(localDate: LocalDate): Long {
val zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault())
val instant = zonedDateTime.toInstant()
return instant.toEpochMilli()
}
val selectedDate = remember { mutableStateOf(LocalDate.now()) }
val datePickerState = rememberDatePickerState(
initialSelectedDateMillis = convertLocalDateToTimestamp(selectedDate.value)
)
CustomDatePickerDialog(
datePickerState,
isDatePickerShown,
onClick = {
selectedDate.value =
convertTimestampToLocalDate(datePickerState.selectedDateMillis!!)
}
)
我打印出了时区。这是正确的(欧洲/柏林)
我打印了时间戳。它是 1728597600000,在 UTC 中是 10 月 10 日,但在德国当地是 10 月 11 日。
智能手机定位设置正确
我打印出 zonedDateTime: 2024-10-11T00:00+02:00[欧洲/柏林]
根据您的输出,转换函数似乎按预期工作。时间戳 1728597600000 对应于 UTC 时间 2024 年 10 月 10 日。当转换为欧洲/柏林时区时,由于时差,它正确地变为 2024 年 10 月 11 日。
您可以检查以下提到的一点:
夏令时:
确保您的逻辑考虑了夏令时,考虑到您的输出,这似乎是正确的。柏林在夏令时期间为 UTC+2。
DatePicker初始化:
验证 DatePicker 是否正确解释初始时间戳。时间戳应对应于 10 月 11 日当地一天的开始(午夜)。
转换与显示:
确保从时间戳到 LocalDate 以及返回时间戳的转换不会引入任何相差一错误。您当前的函数显示正确,但请仔细检查 DatePicker 是否使用正确的initialSelectedDateMillis。
检查日期选择器逻辑:
检查 CustomDatePickerDialog 实现以确保其正确初始化和更新。确保它正确解释本地时区的时间戳。
println("初始 LocalDate: ${selectedDate.value}") // 应该打印 2024-10-11 println("初始时间戳: ${initialTimestamp}") // 应为 1728597600000 println("选定的时间戳: ${datePickerState.selectedDateMillis}") // 检查该值 println("转换后的 LocalDate: ${convertTimestampToLocalDate(datePickerState.selectedDateMillis!!)}") // 应该打印 2024-10-11
在convertTimestampToLocalDate中使用selectedDateMillis之前,还要确保selectedDateMillis不为空。