【发布时间】:2017-05-27 20:30:49
【问题描述】:
环境
- Spring Boot Starter Data JPA 1.4.2
- Eclipselink 2.5.0
- Postgresql 9.4.1211.jre7
问题
我正在构建一个 Spring Boot 微服务,它与另一个服务共享一个 Postgresql 数据库。数据库在外部初始化(我们无法控制),其他服务使用的日期时间列类型是timestamp without time zone。因此,由于我希望 db 上的所有日期都具有相同的类型,因此具有该类型是我的 JPA 实体日期的要求。
我将它们映射到我的 JPA 实体对象的方式如下:
@Column(name = "some_date", nullable = false)
private Timestamp someDate;
问题是当我创建一个时间戳如下:
new java.sql.Timestamp(System.currentTimeMillis())
我查看数据库,时间戳包含我的本地时区日期时间,但我想将其存储为 UTC。这是因为我的默认时区设置为“欧洲/布鲁塞尔”,而 JPA/JDBC 将我的 java.sql.Timestamp 对象转换为我的时区,然后再将其放入数据库。
找到不理想的解决方案
TimeZone.setDefault(TimeZone.getTimeZone("Etc/UTC"));有我想要达到的效果,但是不适合,因为不是我的服务特有的。 IE。它将影响整个 JVM 或当前线程加上子线程。使用
-Duser.timezone=GMT启动应用程序似乎也可以为正在运行的JVM 的单个实例完成这项工作。因此,比上一个更好的解决方案。
但是有没有办法在 JPA/datasource/spring boot 配置中指定时区?
【问题讨论】:
-
如何“查看数据库”?也许只是 PostgreSQL 将时间戳调整为会话的时区?见this answer。
-
感谢您回答@Adam,我只是
SELECT * FROM my_table。根据您链接的答案,“当您稍后显示该时间戳时,您会返回您按字面输入的内容”。如果我SELECT my_timestamp AT TIME ZONE 'UTC' AT TIME ZONE 'UTC' FROM my_table我看到相同的结果,这是有道理的。考虑到这一点,我假设不是 PostgreSQL 调整时区,调整似乎发生在值进入 Java 端的数据库之前。
标签: java postgresql jpa spring-boot timezone