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

时间:2017-09-17 22:46:52

标签: android threetenbp

如何从Android Java日期和日历转换为三个LocalDateTime

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

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

固定!

1 个答案:

答案 0 :(得分:2)

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

LocalDateTime没有区域/偏移量

首先,您对LocalDateTime的使用几乎肯定不合适。您正在丢弃有关时区或偏移的有价值信息。 LocalDateTime类故意没有时区概念或从UTC偏移,因此代表实际时刻,只是对26-范围内可能时刻的粗略概念27个小时左右。

在处理时间轴上的实际时刻时,请使用InstantOffsetDateTimeZonedDateTime

我们只在以下情况下使用LocalDateTime

  • 我们不知道这个区域。
  • 我们打算在多个区域进行非同步时刻(“我们所有的工厂都在中午关闭午餐时间”)。
  • 我们计划在未来几周内进行,因此我们可能会受到反复定义时区的反复无常的政治家的影响,例如夏令时(DST)。我们使用LocalDateTime作为逻辑,并在生成临时日历时以ZonedDateTime形式呈现给用户。
转型

DateTimeUtils

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

DateTimeUtils类提供转换的实用程序方法。

ZonedDateTime zdt = DateTimeUtils.toZonedDateTime( myCalendar ) ; 

...或

Instant instant = DateTimeUtils.toInstant( myCalendar ) ;

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

提示:对于那些想在Android中使用ThreeTen-Backport的人,请参阅ThreeTenABP项目。请参阅How to use ThreeTenABP in Android Project