简体   繁体   中英

Spring + Hibernate + MS SQL server - UTC time zone

I have developed simple application with Spring 4.2.5 + Hibernate 5.1.0 - database system is MS SQL Server 2014.

From few days I am struggling with correct storing time + timezone in database.

Requirements that I need to fulfill is:

  1. Save all dates in UTC time zone.
  2. Store timezone in database column value.

To achieve it I created model called 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;

    ...
}

To enforce saving dates in UTC time zone I used Jadira framework:

    hibProperties.put("jadira.usertype.autoRegisterUserTypes", true);
    hibProperties.put("jadira.usertype.javaZone", "UTC");
    hibProperties.put("jadira.usertype.databaseZone", "UTC");

However during each create/update operation of MyComment object, MyCommentListener is getting date from my local timezone (not UTC date!):

public class MyCommentListener {

    @PreUpdate
    @PrePersist
    public void setLastUpdate(MyComment myComment) {
        myComment.setDate(new Timestamp(System.currentTimeMillis()));
    }

}

Do you know how can I solve this issue?

  1. Should I use other date type in my model? Different than Timestamp?
  2. What kind of type should be DATE_ column in MS SQL server database?

I will appreciate any help. Thank you.

AFAIK, the problem is with listener. Replace the following code in listener and verify. Change the date format as per your need.

    @PreUpdate
    @PrePersist
    public void setLastUpdate(MyComment myComment) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
        myComment.setDate(dateFormat.getCalendar().getTime());
    }

It was very strange for me that there's no property in Spring to set up default TimeZone - at least I do not know about it.

After some googling I found out that the best place in Spring to set time zone is WebApplicationInitializer , so I prepared following code:

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(final ServletContext servletContext) throws ServletException {
        setupTimeZone();
    }

    private void setupTimeZone() {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    }
}

您可以在应用程序属性文件中设置时区属性,如下所示。

spring.jpa.properties.hibernate.jdbc.time_zone=UTC

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM