【问题标题】:JPA and java 8 date API - choosing correct implementation (Instant, LocalDateTime, ZonedDateTime)JPA 和 java 8 日期 API - 选择正确的实现(Instant、LocalDateTime、ZonedDateTime)
【发布时间】:2016-06-01 15:59:46
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 有道理。对于我的最终决定,我发现 JSR-000221 JDBC API 规范 4.2 很有用,尤其是附录 B-4 中的表格。将坚持 LocalDateTime。 jcp.org/aboutJava/communityprocess/mrel/jsr221/index2.html
    • 如果选择使用ZonedDateTimeOffsetDateTime,您能否解释一下mysqljava 实体类中应该使用哪种数据类型?
    猜你喜欢
    • 2019-01-21
    • 2016-09-12
    • 2019-09-24
    • 2020-09-20
    • 2015-12-25
    • 2021-05-08
    • 2017-10-20
    • 2014-11-08
    • 2014-05-12
    相关资源
    最近更新 更多