【问题标题】:How to Convert LocalDate to Long in Kotlin / Java如何在 Kotlin/Java 中将 LocalDate 转换为 Long
【发布时间】:2022-01-07 01:30:15
【问题描述】:

我需要在材料日期选择器中设置日期。它需要Long 来设置日期。我试着这样做:

val formatter = DateTimeFormatter.ofPattern(DAY_FORMAT_PATTERN)
val selectedDate = LocalDate.parse(viewModel.selectedDateStateFlow.value, formatter)
val selectedDateToLong = selectedDate.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli()

val datePicker = MaterialDatePicker.Builder.datePicker()
    .setTheme(R.style.DatePicker)
    .setSelection(selectedDateToLong)
    .build()

在这种情况下,日期选择器将日期设置为少一天。 有更准确的转换选项吗?

例如:

I/System.out: viewModel.selectedDateStateFlow.value = 30 Nov, 2021 
I/System.out: selectedDate = 2021-11-30 
I/System.out: selectedDateToLong = 1638219600000
I/System.out: MaterialDatePicker.todayInUtcMilliseconds() = 1638230400000

但日期选择器设置为“2021 年 11 月 29 日”

手机上的时区 GMT+03:00 莫斯科标准时间

UPD 比较了我将LocalDate 转换为LongMaterialDatePicker.todayInUtcMilliseconds() 的值。收到不同的值。我的翻译有什么错误?

【问题讨论】:

  • 我对 Android API 了解不多,但我本以为它会起作用...你能告诉我你的系统时区是什么吗?是UTC+X吗?
  • 你能提供一个具体的例子吗?我假设在解析viewModel.selectedDateStateFlow.value 和重新格式化数据选择器中的数据之间存在时区差异。如果示例包含 viewModel.selectedDateStateFlow.valueselectedDateselectedDateToLong 的值以及日期选择器显示的内容,那就太好了。
  • 会不会是viewModel.selectedDateStateFlow.value 已经比您预期的“少了一天”?你检查过它的价值吗?
  • 当我打印selectedDate 的值时 - 我得到正确的日期。默认为当前日期。手机上的时区 GMT+03:00 莫斯科标准时间
  • 尝试打印MaterialDatePicker.todayInUtcMilliseconds()。这与selectedDateToLong 的值相同吗?如果不是,数值上的区别是什么?另外,不妨试试ZoneOffset.UTC 而不是ZoneId.systemDefault() :-)

标签: java kotlin material-design


【解决方案1】:

UPD2.

cmets 中的好心人对由于使用不同时区而可能出现的错误是正确的。根据其中一位的建议,我尝试了:

val selectedDateToLong = selectedDate.atStartOfDay(ZoneOffset.UTC)...

而不是

val selectedDateToLong = selectedDate.atStartOfDay(ZoneId.systemDefault())...

它帮助了我

【讨论】:

    猜你喜欢
    • 2013-10-31
    • 1970-01-01
    • 2015-05-23
    • 2011-12-03
    • 2010-11-21
    • 2011-04-12
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多