乔达时间日期时间不正确地存储在数据库(Joda time DateTime incorrectly

2019-06-23 11:48发布

我存储JodaTime DateTime字段timestamptz通过使用列org.jadira.usertype:usertype.jodatime:1.9 。 应用服务器有+4时区。 DB服务器+9时区。 new DateTime()的结果${currentTime+1hour}+9其中+9是时区(正确的值是${currentTime+5hours)+9 )。

我还没有发现任何相关的话题。 java.util.Date商店正确。

域对象有以下映射属性:

static mapping = {
    dateCreated sqlType:'timestamptz'
}

我怎么可以存储日期时间是否正确?

Answer 1:

只需设置JPA属性:

<property name="jadira.usertype.autoRegisterUserTypes"
          value="true"/>
<property name="jadira.usertype.databaseZone"
          value="jvm"/>
<property name="jadira.usertype.javaZone"
          value="jvm"/>


Answer 2:

我遇到过同样的问题。 在配置指定的应用程序和数据库解决区域问题。

            <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>


Answer 3:

好。 我花8小时解决问题。 如果您正在使用的用户类型项目坚持JodaTime,你必须设置databaseZone财产PersistentDateTime级等于当前的应用服务器时区(不是数据库!)。

但最好使用官方休眠支持 。 它解决了这个问题,因为它使用的盒子java.utl.Date坚持DateTimejava.util.Date默认情况下坚持正确



Answer 4:

开始尝试与JVM = -Duser.timezone UTC到JAVA_OPTS这样的时间是在一个区域,然后你可以做你的操作将其转换为任何你的。



Answer 5:

费多尔,

我说得对假设你使用的是Oracle TIMESTAMP WITH TIME ZONE列? 用户类型不支持这种类型的,但(即带有时区)由于与JDBC数据库之间不同的处理,虽然该项目将很乐意接受的补丁。

这里也有一些很好的讨论WRT甲骨文在这里: http://puretech.paawak.com/2010/11/02/how-to-handle-oracle-timestamp-with-timezone-from-java/



Answer 6:

我已经通过创建其他PersistentDateTime解决了这个问题延伸AbstractVersionableUserType。

import java.sql.Timestamp;

import org.hibernate.SessionFactory;
import org.hibernate.usertype.ParameterizedType;
import org.jadira.usertype.dateandtime.joda.columnmapper.TimestampColumnDateTimeMapper;
import org.jadira.usertype.spi.shared.AbstractVersionableUserType;
import org.jadira.usertype.spi.shared.IntegratorConfiguredType;
import org.joda.time.DateTime;

public class PersistentDateTime extends AbstractVersionableUserType<DateTime, Timestamp, TimestampColumnDateTimeMapper> implements ParameterizedType, IntegratorConfiguredType {

@Override
public int compare(Object o1, Object o2) {
    return ((DateTime) o1).compareTo((DateTime) o2);
}

@Override
public void applyConfiguration(SessionFactory sessionFactory) {

    super.applyConfiguration(sessionFactory);

    TimestampColumnDateTimeMapper columnMapper = (TimestampColumnDateTimeMapper) getColumnMapper();
    columnMapper.setDatabaseZone(null);
    columnMapper.setJavaZone(null);
}
}


文章来源: Joda time DateTime incorrectly stores in database