环境
- Spring Boot Starter Data JPA 1.4.2
- Eclipselink 2.5.0
- Postgresql 9.4.1211.jre7
问题
我正在构建一个使用Postgresql数据库的Spring Boot微服务,并与另一个服务共享该数据库。该数据库在外部进行初始化(超出我们的控制范围),而其他服务使用的日期时间列类型为没有时区的时间戳(timestamp without time zone)。因此,由于我希望数据库中所有日期都具有相同类型,在我的JPA实体日期中使用该类型是必需的。
我将它们映射到我的JPA实体对象上的方式如下:
@Column(name = "some_date", nullable = false)
private Timestamp someDate;
问题在于,当我按照以下方式创建一个时间戳时:
new java.sql.Timestamp(System.currentTimeMillis())
我查看了数据库,时间戳包含了我的本地时区日期时间,但我想将其存储为UTC。这是因为我的默认时区设置为'Europe/Brussels',JPA/JDBC在将我的java.sql.Timestamp
对象放入数据库之前会将其转换为我的时区。
找到并不理想的解决方法
TimeZone.setDefault(TimeZone.getTimeZone("Etc/UTC"));
可以达到我想要的效果,但它不适用于我的服务。即它将影响整个JVM或当前线程及其子线程。使用
-Duser.timezone=GMT
启动应用程序似乎也可以针对单个正在运行的JVM实例完成任务。因此,比上一个解决方法更好。
但是,是否可以通过JPA /数据源 / Spring Boot配置指定时区?
SELECT * FROM my_table
。根据您链接的答案,_"当您稍后显示该时间戳时,您会得到您字面输入的内容"_。如果我SELECT my_timestamp AT TIME ZONE 'UTC' AT TIME ZONE 'UTC' FROM my_table
,我看到相同的结果,这很有道理。考虑到这一点,我认为这不是PostgreSQL调整时区,调整似乎发生在Java端将值放入数据库之前。 - oizulain