JPA 和 java 8 日期 API - 选择正确的实现(Instant、LocalDateTime、ZonedDateTime)

标签 jpa time java-8 java-time hibernate-5.x

在以下情况下,哪些可用的 Java 8 时间 API 类最适合 JPA 实体映射:

  • 契约(Contract)创建于信息类型
  • 日期以 UTC 格式存储在数据库中
  • 业务逻辑以 UTC 进行所有计算
  • 日期以欧洲/维也纳时区显示在 UI 中

我见过的大多数示例都使用 LocalDateTime,但那个示例没有任何时区概念。由于我们所有的业务逻辑都应该在 UTC 中进行计算并在 UTC 中检索/存储数据,InstantZonedDateTime 不是更合适吗?

在决定将哪种类型用于 JPA 实体映射时,应该考虑哪些实际影响(例如,无法将一周添加到 Instant)?

最佳答案

Instant 根据定义是 UTC,因此如果您总是处理 UTC,那么只要它具有您需要的所有操作就足够了。 LocalDateTime 是一个没有特定时区或时区偏移量的时间戳,但如果您知道您只处理 UTC,它可能对它提供的操作很有用 Instant不是。

OffsetDateTime 是可以携带明确时区偏移量的最精确类型,它允许您在 UTC 和其他时区之间来回转换时保留时间。有一个方便的 ZoneOffset.UTC 常量,您可以使用该常量将 UTC 的偏移量固定为 +0 小时。 ZonedDateTime 添加了 TimeZone 的概念,它增加了对夏令时等事物的支持,在处理 UTC 时通常不需要这个概念,除非你想显示特定地区的本地时间。

关于JPA 和 java 8 日期 API - 选择正确的实现(Instant、LocalDateTime、ZonedDateTime),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37573602/

相关文章:

java - 自动重用ManyToMany/ManyToOne关系中的现有实体(JPA)

java - 使用 JPA 查询可为空的 @OneToOne 关系

c++ - MPI 与 OpenMP 的性能比较

grails - 在Groovy/Grails中检查耗时

java - 使用 spring-boot 在 Jpa 查询中出错

java - 创建通过检查相关列表中的项目来选择的查询

php - 创建 php 实时时钟

Java8 可选和 null 检查

java - 两个 URI 对象相等,但它们的 toString() 不同

java - 扩展现有的流收集器实例