JPA 版本:
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>3.2.1</version>
@PersistenceContext
EntityManager entityManager;
Session session = this.entityManager.unwrap(Session.class);
session.save(user)
数据类型为 ZonedDateTime
@Column(name = "CREATE_TIME")
private ZonedDateTime createTime;
当我调试时,我发现时间是正确的,但是当我调用save时,它在数据库中存在的时间比我在调试中看到的时间少了八个小时。我反复检查数据库时间,确认数据库时间是和我的服务器时间一致,时区也一致(都是上海时区)
这个事件让我感受到JPA是否会自动将时间转换为UTC时间并插入到DB中
我不确定问题是什么,但我认为你很好地分析了情况:
这个事件让我感受到JPA是否会自动将时间转换为UTC时间并插入到DB中
我认为除了完全拒绝
ZonedDateTime
之外,这是合理的做法。 A ZonedDateTime
基本上是一个时间点加上时区。
此类存储所有日期和时间字段(精确到纳秒)和时区,以及用于处理不明确的本地日期时间的区域偏移量 https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html
数据库通常无法存储时区信息,因此为了至少保留时间点信息,将其转换为 UTC 是有意义的。
当然,这留下了一个问题:再次加载数据时将使用哪个时区。我想它将使用您(即您的应用程序服务器)本地时区,这可能是也可能不是您想要的。
如果这种行为对你有效,那么你很幸运。 如果没有,请使用没有时区但也不是时间点的
LocalDateTime
。这意味着如果 LocalDateTime
跨时区共享,它就失去了所有意义。不要让我开始使用夏令时。
或者使用 Instant
,它实际上是一个时间点,使用 UTC 时区表示。
您的时区信息应放入数据库中的单独字段中。再次确保正确处理夏令时。
如果你真的想让一切都正确并且你的大脑受到伤害,请考虑时区定义可能会随着时间的推移而改变。