joda-time和Hibernate - 日期未以UTC格式存储

时间:2015-09-03 17:24:50

标签: java hibernate jodatime

我正在使用DateTime以便在UTC时间内在我的服务器上存储时间戳:

// @Entity ..
@NotNull
@Column(name="DATE")
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime date;

在服务器启动期间,我这样做:

DateTimeZone.setDefault(DateTimeZone.UTC);

确保new DateTime()始终处于UTC时间,这就是我准备存储日期的方式:

DateTime utc = new DateTime();
utc = utc.dayOfMonth().roundFloorCopy();

DateTime thisMonday = utc.withDayOfWeek(DateTimeConstants.MONDAY);
DateTime thisTuesday = thisMonday.plusDays(1);

如果我正在调试这个,我会看到,例如

  

2015-08-31 00:00:002015-09-01 00:00:00

但是当我查看数据库时,我看到了

  

2015-08-31 02:00:002015-09-01 02:00:00

存放在那里。它是+ 2h,这是我当地的UTC偏移量(柏林/维也纳)。

为什么会发生这种情况?如何确保我的服务器始终以UTC格式存储?

1 个答案:

答案 0 :(得分:1)

您正在使用Jadira将JodaTime类型转换为SQL日期/时间类型。使用这些JPA / Hibernate属性告诉Jadira在向数据库发送数据时应该应用哪个时区

<properties>
    <property name="jadira.usertype.javaZone" value="UTC" /> <!-- or "jvm" to use your default JVM TZ, explicit Europe/Berlin or +02:00 etc. -->
    <property name="jadira.usertype.databaseZone" value="UTC" /> <!-- or "jvm" to use your default JVM TZ or +02:00 etc. But you'd better not use an explicit TZ with a DST change -->
</properties>

有关详细信息,请参阅Jadira User Guide

其他问题是,您的数据库是否正在使用您的连接信息来显示您所在时区的时间戳?这取决于它是哪个DB以及您使用哪个工具进行连接。 SQL Developer(用于Oracle DB)知道您的计算机的TZ,并将连接TZ设置为。