使用hibernate和joda time在数据库中存储DateTime时,我遇到了奇怪的问题。
我有这样的豆:
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"));
如果我将具有修订日期的实体保存到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
答案 0 :(得分:3)
这是因为zoda DateTime以UTC格式存储db中的日期,而LocalDateTime按日期存储日期,并且在您不关心时区时应该使用。
如果您需要考虑时区(日光节省等),则需要考虑日期时间,以此方式处理,并将日期存储在世界时。
请参阅此answer了解详细信息。