我用Spring 4.2.5 + Hibernate 5.1.0开发了简单的应用程序 - 数据库系统是MS SQL Server 2014。
从几天开始,我在数据库中正确处理正确的存储时间+时区。
我需要履行的要求是:
为了实现它,我创建了名为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()));
}
}
您知道我该如何解决这个问题吗?
我将不胜感激任何帮助。谢谢。
答案 0 :(得分:1)
AFAIK,问题在于听众。在侦听器中替换以下代码并验证。根据需要更改日期格式。
@PreUpdate
@PrePersist
public void setLastUpdate(MyComment myComment) {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
myComment.setDate(dateFormat.getCalendar().getTime());
}
答案 1 :(得分:0)
对我来说很奇怪,Spring中没有设置默认TimeZone的属性 - 至少我不知道它。
经过一些谷歌搜索后,我发现Spring中设置时区的最佳位置是WebApplicationInitializer
,所以我准备了以下代码:
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(final ServletContext servletContext) throws ServletException {
setupTimeZone();
}
private void setupTimeZone() {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
}