将 Java.util.Calendar 转换为 org.threeten.bp.LocalDateTime(适用于 Android)

Convert Java.util.Calendar to org.threeten.bp.LocalDateTime (for Android)

提问人:Marc 提问时间:9/18/2017 最后编辑:Marc 更新时间:9/18/2017 访问量:3509

问:

如何从Android Java Date and Calendar转换为threeten LocalDateTime

Calendar calTime = Calendar.getInstance();
Date date = calTime.getTime();

LocalDateTime ldt = Instant.ofEpochSecond(date.getTime()/1000)
    .atZone(ZoneId.systemDefault())
    .toLocalDateTime();

固定!

安卓 ThreeTenBP

评论


答:

3赞 Basil Bourque 9/18/2017 #1

您的解决方案不是最佳解决方案。

LocalDateTime没有区域/偏移量

首先,您几乎可以肯定使用是不合适的。您正在丢弃有关时区或偏移量的宝贵信息。LocalDateTime 类特意没有时区或相对于 UTC 的偏移量的概念,因此表示实际时刻,仅表示 26-27 小时左右范围内可能的时刻的粗略概念。LocalDateTime

相反,在处理时间轴上的实际时刻时,请使用 、 和 。InstantOffsetDateTimeZonedDateTime

我们仅在以下情况下使用:LocalDateTime

  • 我们不知道这个区域。
  • 我们打算在非同时的时刻设置多个区域(“我们在世界各地的所有工厂都在中午关闭午餐”)。
  • 我们将时间安排在未来几周内,因此我们可能会受到反复无常的政客的打击,他们重新定义了时区,例如夏令时 (DST),几乎没有通知。我们用于逻辑,并在生成瞬态日历时呈现给用户。LocalDateTimeZonedDateTime

DateTimeUtils对于转化

接下来,您的转换数学是不必要的。

DateTimeUtils 类提供用于转换的实用工具方法。

ZonedDateTime zdt = DateTimeUtils.toZonedDateTime( myCalendar ) ; 

或。。。

Instant instant = DateTimeUtils.toInstant( myCalendar ) ;

P.S. 不要在问题的正文中回答您的问题。相反,发布一个实际的答案,然后接受它以关闭问题。

提示:对于那些想在Android中使用ThreeTen-Backport的人,请参阅ThreeTenABP项目。并查看如何在Android项目中使用ThreeTenABP