如何使用Java Hibernate始终将正确的UTC日期时间值保存到H2和MySQL数据库的DATETIME类型字段中?
完整上下文:
我在数据库中有一个带有DATETIME字段的表,我想在其中插入行:
默认情况下(未给出值时)将存储当前UTC时间
或者,如果给定了 UTC 日期时间,则应在不进行其他时区转换的情况下存储该时间。
它必须在本地H2数据库以及Docker内部的本地mysql和外部AWS RDS MySQL实例上运行的问题。
而且我很难在所有3个实例中正确保存日期时间。
到目前为止,本地和aws mysql实例要么获得正确的值,但本地H2获得错误的值,要么相反,当本地H2获得正确的值但MySQL实例获得错误的值时。
以下是我拥有的kotlin代码的缩短片段。
适用于 H2 但不适用于 Docker 和 AWS 中的 MySQL 的代码:
@Entity
data class SomeEntity(
val createdAt: LocalDateTime = LocalDateTime.now(Clock.systemUTC())
// If createdAt is not explicitly given when saving new entry in db, the default value will be used
// and H2 will get correct value of '2019-03-28 12:36:56',
// but it will be wrong for MySQL, it will get '2019-03-28 11:36:56'
)
val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd H:mm:ss")
createdAt = LocalDateTime.parse("2012-11-30 16:13:21", dateTimeFormatter)
// In this case when createdAt is explicitly given when saving new entry in db,
// H2 gets correct value '2012-11-30 16:13:21',
// but MySQL DBs will get wrong value of '2012-11-30 17:13:21'
适用于 Docker 和 AWS 中的 MySQL 但不适用于 H2 的代码:
@Entity
data class SomeEntity(
val createdAt: Date = Date()
// If createdAt is not explicitly given when saving new entry in db, the default value will be used
// and MySQL DBs will get correct value of '2019-03-28 12:36:56'
// but it will be wrong for H2 as it will get '2019-03-28 13:36:56' (my current local time instead of UTC)
)
val dateTimeFormatter = SimpleDateFormat("yyyy-MM-dd H:mm:ss")
dateTimeFormatter.timeZone = TimeZone.getTimeZone("UTC")
createdAt = dateTimeFormatter.parse("2012-11-30 16:13:21")
// In this case when createdAt is explicitly given when saving new entry in db,
// MySQL DBs will get correct value '2012-11-30 16:13:21',
// but H2 will get wrong value of '2012-11-30 17:13:21'
运行于:Spring Boot 2.1.3,Hibernate Core 5.3.7,MySQL 8.0.13,H2 1.4.197
我在网上和stackoverflow上看到了一堆问题,但不幸的是,没有一个解决方案可以解决我的问题。
杨__羊羊
相关分类