【发布时间】:2016-12-13 22:24:39
【问题描述】:
我使用 Spring 4.2.5 + Hibernate 5.1.0 开发了简单的应用程序 - 数据库系统是 MS SQL Server 2014。
从几天开始,我一直在努力在数据库中正确存储时间 + 时区。
我需要满足的要求是:
- 以 UTC 时区保存所有日期。
- 将时区存储在数据库列值中。
为了实现它,我创建了名为 MyComment 的模型:
@Entity
@Table(name = "MY_COMMENT")
@EntityListeners(value = { MyCommentListener.class })
@Audited
public class MyComment implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
@Column(name = "DATE_", nullable = false)
private Timestamp date;
...
}
为了强制在 UTC 时区保存日期,我使用了 Jadira 框架:
hibProperties.put("jadira.usertype.autoRegisterUserTypes", true);
hibProperties.put("jadira.usertype.javaZone", "UTC");
hibProperties.put("jadira.usertype.databaseZone", "UTC");
但是,在 MyComment 对象的每次创建/更新操作期间,MyCommentListener 都会从我的本地时区(不是 UTC 日期!)获取日期:
public class MyCommentListener {
@PreUpdate
@PrePersist
public void setLastUpdate(MyComment myComment) {
myComment.setDate(new Timestamp(System.currentTimeMillis()));
}
}
你知道我该如何解决这个问题吗?
- 我应该在我的模型中使用其他日期类型吗?不同于时间戳?
- MS SQL server 数据库中的 DATE_ 列应该是什么类型?
我将不胜感激。谢谢。
【问题讨论】:
-
也许您应该添加一个“jadira”标签。您还应该指定是否要将时区 name 或 offset 存储在数据库列中。
-
您能再描述一下吗?我不明白你的意思。
-
jadira 标签,因为您使用的是它们的类型。您的要求似乎是技术性的(存储 UTC),但随后是“将时区存储在数据库列值中”。错过指定时区偏移量或标识符。 Identifier 有更多信息,见w3.org/TR/timezone/#tzids 和w3.org/TR/timezone/#datetime 这取决于你需要做什么。存储时区的目的是什么?
标签: sql-server spring hibernate datetime timezone