Instant和ZonedDateTime之间的兼容性

Dan*_*olf 11 java datetime java-time

据我所知,a ZonedDateTime实际上是一个增强版本Instant.它具有所有数据Instant(沿UTC时间线的精确值),以及时区信息.因此,我天真的假设是,a ZonedDateTime -an Instant并且任何采取Instant遗嘱的方法都会采取ZonedDateTime相反的方式.此外,我所料isBefore(),isAfter()等之间进行无缝协作InstantS和ZonedDateTime秒.

查看API文档,Instant并且ZonedDateTime没有一个是这种情况.我可以将Instants与Instants和ZonedDateTimes 进行比较ZonedDateTime,但这两个类似乎是不兼容的.更重要的是,像ThreeTen-Extra这样的第三方代码Interval似乎只适用于Instants.

是否存在Instant并且ZonedDateTime不打算混合的原因?

Jod*_*hen 8

Instant并且ZonedDateTime具有不同的状态 - Instant仅仅是从纪元开始的数个纳秒,而ZonedDateTime由a LocalDateTime,ZoneId和组成ZoneOffset.这样,这两个类可以转换到/从对方,但不是相同的(和转换时丢失信息ZonedDateTimeInstant).

的行为isBefore(),并isAfter()恰好但两者之间的匹配.而实施Comparable匹配推荐的行为,即"强烈建议(尽管不是必需的)自然排序与等于一致." 即.compareTo()考虑到当地的日期,时间,时区和抵消,而isBefore()isAfter()只考虑瞬间.

编写比较器来比较a Instant和a ZonedDateTime相对简单:

Comparator<TemporalAccessor> comparator =
    (a, b) -> Instant.from(a).compareTo(Instant.from(b));
Run Code Online (Sandbox Code Playgroud)

也可以写成:

Comparator<TemporalAccessor> comparator = Comparator.comparing(Instant::from);
Run Code Online (Sandbox Code Playgroud)

  • 仅仅打印出数纳秒的`toString`实现不是很有帮助。因此,`toString`会以UTC打印时间。 (2认同)

Smu*_*tje 7

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

如果没有DST,将a LocalDateTime转换为Instant(完全匹配,夏季 - 间隙,冬季 - 重叠)的三种可能情况将减少为1,转换将是单射的,AFAIK.

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

  • ZonedDateTime文档指出:“此类存储...用于处理模棱两可的本地日期时间的区域偏移量。” 这是否意味着从ZonedDateTime到Instant有明确的映射? (2认同)