簡體   English   中英

Spring + Hibernate + MS SQL 服務器 - UTC 時區

[英]Spring + Hibernate + MS SQL server - UTC time zone

我用 Spring 4.2.5 + Hibernate 5.1.0 開發了簡單的應用程序 - 數據庫系統是 MS SQL Server 2014。

從幾天開始,我一直在努力在數據庫中正確存儲時間 + 時區。

我需要滿足的要求是:

  1. 以 UTC 時區保存所有日期。
  2. 將時區存儲在數據庫列值中。

為了實現它,我創建了名為 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()));
    }

}

你知道我該如何解決這個問題嗎?

  1. 我應該在我的模型中使用其他日期類型嗎? 與時間戳不同?
  2. MS SQL 服務器數據庫中的 DATE_ 列應該是哪種類型?

我將不勝感激任何幫助。 謝謝你。

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());
    }

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"));
    }
}

您可以在應用程序屬性文件中設置時區屬性,如下所示。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM