我想在SQL Server 2008中使用datetimeoffset列来存储日期和时间以及时区.
数据库中列的DDL定义:
LastUpdatedDateTime datetimeoffset DEFAULT SysDateTimeOffset()
Run Code Online (Sandbox Code Playgroud)
使用Hibernate映射我的实体上的字段的Java定义:
private ZonedDateTime lastUpdatedDateTime = ZonedDateTime.now();
Run Code Online (Sandbox Code Playgroud)
我正在使用Hibernate 5.1.0.Final(通过Spring启动1.3.2.RELEASE)并包含org.hibernate:hibernate-java8.
观察到的行为(通过使用WinSQL查询数据库):通过SQL insert语句插入数据导致存储正确的日期和时间并更正时区:2016-03-03 13:41:17.5358944 -07:00
通过保存Java实体插入数据(根据上面的Java代码片段初始化字段).Java将日期/时间值(保存前)报告为:2016-03-04T14:18:17.076-07:00 [America/Denver]
保存后,WinSQL将存储在数据库中的值报告为:2016-03-04 14:18:17.0760000 +00:00
它具有相同的日期和时间,但时区错误(UTC而不是-07:00).
当我使用Timestamp而不是ZonedDateTime在Java中声明字段时,我得到了相同的行为.
如何正确存储时区?我不关心它是否存储为UTC或-07:00时区,只要时间基于时区是正确的.我认为Hibernate将为此提供支持(在hibernate-java8库中)并且我不必编写自定义转换器或自定义用户数据类型的代码.