Sql server 弹簧&x2B;冬眠+;MS SQL server-UTC时区
我用Spring 4.2.5+Hibernate 5.1.0开发了一个简单的应用程序-数据库系统是MS SQL Server 2014 几天来,我一直在努力在数据库中正确存储时间+时区 我需要满足的要求是:Sql server 弹簧&x2B;冬眠+;MS SQL server-UTC时区,sql-server,spring,hibernate,datetime,timezone,Sql Server,Spring,Hibernate,Datetime,Timezone,我用Spring 4.2.5+Hibernate 5.1.0开发了一个简单的应用程序-数据库系统是MS SQL Server 2014 几天来,我一直在努力在数据库中正确存储时间+时区 我需要满足的要求是: 保存UTC时区中的所有日期 在数据库列值中存储时区 为了实现它,我创建了一个名为MyComment的模型: @Entity @Table(name = "MY_COMMENT") @EntityListeners(value = { MyCommentListener.class }) @A
@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对象时,MyCommmentListener都会从我的本地时区(而不是UTC日期!)获取日期:
}
你知道我如何解决这个问题吗
我将感谢任何帮助。谢谢。好吧,问题出在听众身上。替换侦听器中的以下代码并进行验证。根据需要更改日期格式
@PreUpdate
@PrePersist
public void setLastUpdate(MyComment myComment) {
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
myComment.setDate(dateFormat.getCalendar().getTime());
}
对我来说很奇怪的是,在春季没有设置默认时区的属性——至少我不知道 通过谷歌搜索,我发现春季设置时区的最佳地点是
WebApplicationInitializer
,因此我准备了以下代码:
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(final ServletContext servletContext) throws ServletException {
setupTimeZone();
}
private void setupTimeZone() {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
}
是的,你说得对。这段代码可以工作,但我正在寻找一个通用的解决方案,在我的Spring应用程序中默认使用UTC时区。假设我有10个监听器正在为我的模型注入时间,那么我需要将上述代码重复10次。我希望由于我使用的是Jadira,它将使用UTC时区作为默认时区。如果您希望将整个应用程序置于UTC,请在启动时区时使用它。setDefault(TimeZone.getTimeZone(“UTC”);也许你应该加上一个“jadira”标签。您还应该指定是否要在数据库列中存储时区名称或偏移量。请您详细描述一下?我不完全明白你的意思。jadira标签是因为你在使用它们的类型。您的要求似乎是技术性的(存储UTC),但“将时区存储在数据库列值中。”未指定时区偏移量或标识符。标识符包含更多信息,请参阅,这取决于您需要执行的操作。存储时区的目的是什么?
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(final ServletContext servletContext) throws ServletException {
setupTimeZone();
}
private void setupTimeZone() {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
}