簡體   English   中英

持久化到 PostgreSQL`timestamp with time zone` 時,如何防止 Hibernate 將 ZonedDateTime 轉換為 UTC

[英]How do I prevent Hibernate from converting ZonedDateTime to UTC when persisting to PostgreSQL `timestamp with time zone`

設置:

休眠:5.4.32
彈簧靴:2.5.4
org.postgresql:postgresql: 42.2.23

我有一個班級和一張桌子

@Entity
public class MyType{

    @Id
    @GeneratedValue(generator = "uuid2")
    @Type(type = "uuid-char")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    private UUID id;

    @Column
    public ZonedDateTime time;

    public MyType(){}

    // omitting getters and setters
}
create table if not exists my_type
(
    id text not null
        constraint idx_16559_pk__data_fil__3213e83ff1283b3a
            primary key,
    time timestamp with time zone
)

問題

我想要實現的是在寫入數據庫時​​保留MyType.time時區信息。 無論我嘗試什么,它總是轉換為 UTC。 有一個選項( hibernate.jdbc.time_zone )來設置特定的時區,但我想保留具有不同時區的ZonedDateTime實例,並且由於 Java 和 Postgres 有一個類型,我希望有一些方法可以實現這一點。

對我來說最壞的情況是將其存儲為字符串並手動進行反/序列化。

在 Postgres 中, TIMESTAMP WITH TIME ZONE實際上以 UTC 格式將其日期存儲在數據庫中。

“帶時區”意味着它希望在插入時指定一個時區,並將指定的時間轉換為 UTC。 通過這樣做,它可以標准化所有時間戳,如果您想比較或排序日期,這很有意義。

因此,數據庫不會存儲時區,您將需要另一種方式來存儲或確定它。

所有時區感知日期和時間都以 UTC 內部存儲。 (PostgreSQL 文檔)

您可以將時區視為用戶的一種“格式”。 每個用戶都可以有自己的時區,然后應該以不同的方式格式化相同的日期。 它仍然是相同的值,只是以不同的方式顯示。

從這方面來看,僅在用戶的設置或配置文件中存儲時區可能是有意義的。

在我看來,這種格式化甚至不應該由 API 來完成。 它應該由前端完成。 如果用戶沒有在其用戶首選項中設置時區,您實際上可以使用客戶端操作系統的時區或網絡瀏覽器的時區。

暫無
暫無

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

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