据我了解,ZonedDateTime
实际上是Instant
的增强版本。它具有Instant
具有的所有数据(沿UTC时间线的精确值),以及时区信息。所以我天真的假设是ZonedDateTime
是一个 Instant
,任何采用Instant
的方法都会很乐意采用ZonedDateTime
。此外,我希望isBefore()
,isAfter()
等能够在Instant
和ZonedDateTime
s之间无缝地工作。
查看Instant
和ZonedDateTime
的API文档,但并非如此。我可以将Instant
与Instant
和ZonedDateTime
与ZonedDateTime
s进行比较,但这两个类似乎不兼容。更重要的是,像ThreeTen-Extra的Interval
这样的第三方代码似乎只与Instant
一起使用。
是否有理由说Instant
和ZonedDateTime
不是混合的?
答案 0 :(得分:7)
Instant
和ZonedDateTime
具有不同的状态 - Instant
距离纪元只有几纳秒,而ZonedDateTime
则包含LocalDateTime
,{{ 1}}和ZoneId
。因此,这两个类可以相互转换,但不一样(在将ZoneOffset
转换为ZonedDateTime
时,您会丢失信息。)
Instant
和isBefore()
的行为完全匹配。而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)
Instant
和ZonedDateTime
具有不同的算术规则。这是我可以避免这两种类型的多态性的唯一原因。例如,将{em> n 天添加到Instant
意味着将 n次乘以86400 秒。总是。如果ZonedDateTime
是Instant
的子类,则不会如此,因为有夏令时的规定。
我的理解是Instant
类似于时区为ZonedDateTime
的{{1}},因此您可以说UTC
是 Instant
。但是,这将使ZonedDateTime
比今天更加复杂,因为它将允许使用Instant
之类的TemporalUnit
进行算术运算。 months 的算术依赖于时区,因此MONTHS
迫使程序员在执行时选择一个明确的时区。
无论如何,不幸的是Instant
和Instant
的兼容性更高,因为它们都清楚地代表了时间。看起来它们缺少一个通用的基类或接口,没有任何算术方法。