我正在使用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:00
和2015-09-01 00:00:00
但是当我查看数据库时,我看到了
2015-08-31 02:00:00
和2015-09-01 02:00:00
存放在那里。它是+ 2h,这是我当地的UTC偏移量(柏林/维也纳)。
为什么会发生这种情况?如何确保我的服务器始终以UTC格式存储?
答案 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设置为。