Instant和ZonedDateTime之间的兼容性

时间:2016-11-10 10:02:26

标签: java datetime java-time

据我了解,ZonedDateTime实际上是Instant的增强版本。它具有Instant具有的所有数据(沿UTC时间线的精确值),以及时区信息。所以我天真的假设是ZonedDateTime 是一个 Instant,任何采用Instant的方法都会很乐意采用ZonedDateTime。此外,我希望isBefore()isAfter()等能够在InstantZonedDateTime s之间无缝地工作。

查看InstantZonedDateTime的API文档,但并非如此。我可以将InstantInstantZonedDateTimeZonedDateTime s进行比较,但这两个类似乎不兼容。更重要的是,像ThreeTen-Extra的Interval这样的第三方代码似乎只与Instant一起使用。

是否有理由说InstantZonedDateTime不是混合的?

3 个答案:

答案 0 :(得分:7)

InstantZonedDateTime具有不同的状态 - Instant距离纪元只有几纳秒,而ZonedDateTime则包含LocalDateTime,{{ 1}}和ZoneId。因此,这两个类可以相互转换,但不一样(在将ZoneOffset转换为ZonedDateTime时,您会丢失信息。)

InstantisBefore()的行为完全匹配。而Comparable的实现与推荐的行为相匹配,即#34;强烈建议(尽管不是必需的)自然排序与equals一致。"即。 isAfter()考虑了本地日期时间,时区和偏移量,而compareTo()isBefore()仅考虑当前日期。

编写比较器来比较isAfter()Instant相对简单:

ZonedDateTime

也可以写成:

Comparator<TemporalAccessor> comparator =
    (a, b) -> Instant.from(a).compareTo(Instant.from(b));

答案 1 :(得分:6)

因为翻译不是单射的。以2016年10月30日星期日凌晨2:15在德国/慕尼黑为例:这个日期/时间代表哪个Instant?如果没有一些假设,这不能独立回答,因为您不知道这个时间是否应该转换为之前的Instant 之后的应该节省时间(DST)。或者2016年3月27日星期日凌晨2:15在德国/慕尼黑:这个日期/时间组合不应该存在,因为时钟应该在凌晨2点设置为凌晨3点。

如果没有夏令时,将LocalDateTime翻译成Instant(完全匹配,夏季间隙,冬季重叠)的三种可能情况将减少为1,转换将是单射的,AFAIK。

编辑:&#34;动手&#34;这个问题,当我们在基于JSF的应用程序中显示日期/时间时,我们总是将相应计算的偏移量传递给DST的当前状态到格式化程序中。

答案 2 :(得分:0)

InstantZonedDateTime具有不同的算术规则。这是我可以避免这两种类型的多态性的唯一原因。例如,将{em> n 天添加到Instant意味着将 n次乘以86400 秒。总是。如果ZonedDateTimeInstant的子类,则不会如此,因为有夏令时的规定。

我的理解是Instant类似于时区为ZonedDateTime的{​​{1}},因此您可以说UTC Instant。但是,这将使ZonedDateTime比今天更加复杂,因为它将允许使用Instant之类的TemporalUnit进行算术运算。 months 的算术依赖于时区,因此MONTHS迫使程序员在执行时选择一个明确的时区。

无论如何,不​​幸的是InstantInstant的兼容性更高,因为它们都清楚地代表了时间。看起来它们缺少一个通用的基类或接口,没有任何算术方法。