Instant vs LocalDateTime - 何时优先于另一个

gal*_*arm 21 java java-8 java-time

我需要以UTC格式保存并显示我的服务器中发生的事件的日期时间.我可以选择使用Instant.now()或LocalDateTime.now(ZoneOffset.UTC)

我什么时候应该更喜欢一个?

ass*_*ias 23

这取决于您想要对数据做什么.这两种类型在概念上是不同的.

想象一下,事件发生在UTC时间早上8点.

一旦你有了LocalDateTime,你就丢失了时区信息,它在技术上可能在任何时区 - 所以可能是UTC时间早上8点或东部时间早上8点(= UTC时间下午1点).这意味着您必须"知道"您的约定是LocalDateTime实际上是UTC时刻.

如果您使用Instant,则无论时区如何,您都可以确切地知道什么时间被引用,并且不需要外部"知识"或约定.但是,您没有时区信息,因此您不知道它是英国时间上午9点(欧洲中部时间)上午8点或美国东部时间凌晨3点(但这些都代表同一时刻).

最后,如果你需要时刻和它应该与哪个时区相关联,你可以使用ZonedDateTime或OffsetDateTime来获取Instant和时区信息.

  • 似乎Instant更适合作为大多数流程的使用.只有当我需要向用户表示信息时,我才会进行转换:LocalDateTime.ofInstant(instantValue,ZoneOffset.UTC)(我必须这样做,因为无法直接提取特定的日期和时间组件,如小时或天,直接来自即时型) (8认同)
  • 坦率地说,LocalDateTime 似乎是一个不需要 UTC 但可以位于任何时区的时间(并且此类时区不是作为信息给出的,您必须记住某处或忽略)似乎是有史以来最无用的类。 (2认同)