我正在使用DateTime
将JodaTime timestamptz
字段存储到org.jadira.usertype:usertype.jodatime:1.9
列。应用服务器的时区为+4。数据库服务器+9时区。 new DateTime()
产生${currentTime+1hour}+9
,其中+9是时区(正确值为${currentTime+5hours)+9
)。
我尚未找到任何相关主题。 java.util.Date
正确存储。
域对象具有以下映射属性:
static mapping = {
dateCreated sqlType:'timestamptz'
}
如何正确存储DateTime?
只需设置JPA属性:
<property name="jadira.usertype.autoRegisterUserTypes"
value="true"/>
<property name="jadira.usertype.databaseZone"
value="jvm"/>
<property name="jadira.usertype.javaZone"
value="jvm"/>
我有同样的问题。在配置中指定应用程序和数据库区域可解决此问题。
<prop key="jadira.usertype.autoRegisterUserTypes">true</prop>
<prop key="jadira.usertype.databaseZone">America/Los_Angeles</prop>
<prop key="jadira.usertype.javaZone">America/Los_Angeles</prop>
好我已经花了8个小时来解决问题。如果您正在使用usertype项目保留JodaTime,则必须将databaseZone
类的PersistentDateTime
属性设置为等于当前应用程序服务器时区(不是数据库!)。
但是最好使用official hibernate support。它解决了现成的问题,因为它使用java.utl.Date
持久保存DateTime
,并且默认情况下正确使用java.util.Date
持久保存
尝试使用-Duser.timezone = UTC将JVM启动到JAVA_OPTS,这样时间就在一个区域中,然后您可以对该区域进行操作以将其转换为您所处的位置。
Fedor,
我是否正确地假设您正在使用Oracle TIMESTAMP WITH TIME ZONE列?尽管该项目很乐意接受补丁程序,但由于JDBC在数据库之间的处理有所不同,因此用户类型尚不支持此类型(例如,使用TIME ZONE)。
这里有关于Oracle的一些很好的讨论:http://puretech.paawak.com/2010/11/02/how-to-handle-oracle-timestamp-with-timezone-from-java/
我已经通过创建其他PersistentDateTime扩展AbstractVersionableUserType来解决此问题。
仅是Spring Boot用户的更新。我能够执行以下操作: