如何使用Hibernate将Joda DateTime存储到SQL Server数据库中

3

使用Hibernate和Joda Time将DateTime存储到数据库时,我遇到了奇怪的问题。

我有这样一个bean:

import org.joda.time.DateTime;

public class RelationshipEntity  {

    @Column(name = "date_revision")
    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
    private DateTime dateRevision;

    // other fields
}

我已经在应用程序中使用 TimeZone.setDefault(TimeZone.getTimeZone("Europe/Paris")); 设置了时区为欧洲/巴黎(GMT+1)。

如果我将具有修订日期2017-01-19 13:24的实体保存到数据库中,我可以看到数据库中的日期已设置为2017-01-19 12:24,但我不明白为什么。

数据库时区似乎也是欧洲/巴黎,因为:

SELECT SYSDATETIME(); //2017-01-19 14:41

SELECT SYSUTCDATETIME(); // 2017-01-19 13:41

由于我使用spring-boot,我尝试在application.yml中添加以下属性:

jadira.usertype.autoRegisterUserTypes: true
jadira.usertype.databaseZone: jvm
jadira.usertype.javaZone: jvm  

需要使用参数-Duser.timezone=Europe/Paris启动应用程序,但它仍将日期保存为UTC格式存储到数据库中。

为了解决这个问题,我将DateTime更改为LocalDateTime

@Column(name = "date_revision")
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
private DateLocalTime dateRevision;

通过这个改变,数据库中的dateRevision与我在Java bean中设置的相同。

有人可以解释一下为什么使用org.joda.time.DateTime类型时,它会将日期转换成UTC吗?

注意:我使用的是Hibernate 4和joda-time 2.5。


在将时间保存到数据库时,是否有一个通用标准是有意义的呢?如果两个不同时区的用户使用它会怎样呢? - notanormie
如果我的应用程序和数据库的时区相同,我不明白为什么在Java中的日期和数据库中的日期之间会有差异。当使用DateTime时,默认行为是将日期转换为UTC吗? - Olivier Boissé
1个回答

4
这是因为zoda DateTime在数据库中以UTC存储日期,而LocalDateTime将日期存储为它本身,当您不关心时区时应使用它。
在需要考虑时区(夏令时等)的情况下,DateTime会处理并以协调世界时存储日期。
请参阅此答案获取详细信息。

我认为你是对的,文档PersistentDateTime说:“该类型使用UTC时区存储并在JVM中使用JVM的默认时区呈现”,这就是我出现这种行为的原因。 - Olivier Boissé

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接