Android Kotlin LocalDate 时间戳转换

问题描述 投票:0回答:1

我的 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[欧洲/柏林]

android kotlin timezone utc
1个回答
0
投票

根据您的输出,转换函数似乎按预期工作。时间戳 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不为空。

© www.soinside.com 2019 - 2024. All rights reserved.