2016-04-12 117 views
2

後續問題到我原來的issuePostgres UTC到Java ZonedDateTime

因爲我知道任何使用的日期時間都是針對已知的時區,而不是用戶可能提交請求的地方,所以我採用了LocalDateTime,轉換爲UTC並保留。然後,當檢索約會時,我將保存的時間轉換爲會議地點時區(存儲在數據庫中)。但是,似乎我保存的值實際上保存在我的本地時區中。

我收到的日期時間值的休息控制器如:

startLocalDateTime: 2016-04-11T10:00 
endLocalDateTime: 2016-04-11T10:30 

任用有兩個ZoneDateTime領域:

@Column(name = "startDateTime", columnDefinition= "TIMESTAMP WITH TIME ZONE") 
private ZonedDateTime startDateTime; 
@Column(name = "endDateTime", columnDefinition= "TIMESTAMP WITH TIME ZONE") 
private ZonedDateTime endDateTime; 

然後我將值更改爲UTC和存儲在我的實體存儲到Postgres:

appointment.setStartDateTime(startLocalDateTime.atZone(ZoneId.of("UTC"))) 
appointment.setEndDateTime(endLocalDateTime.atZone(ZoneId.of("UTC"))) 

和我存儲在Postgres (columnDefinition= "TIMESTAMP WITH TIME ZONE") Wh恩我看紀錄pgadminIII我看到:

startDateTime "2016-04-11 04:00:00-06" 
endDateTime "2016-04-11 04:30:00-06" 

所以這些看起來妥善存放在UTC格式(請糾正我,如果我做錯什麼至今)。我然後從數據庫中獲取它們和它們返回:當我找回它們,他們

{ 
"appointmentId":50, 
"startDateTime":"2016-04-11T04:00", 
"endDateTime":"2016-04-11T04:30" 
} 

所以即使我將其保存爲UTC,:

Appointment 
startdatetime: 2016-04-11T04:00-06:00[America/Denver] 
enddatetime: 2016-04-11T04:30-06:00[America/Denver] 

這些值送回作爲JSON是MST(我的本地)時區,而不是UTC,我無法將它們轉換回實際時間。

仍在掙扎着持久。我曾嘗試在我的實體上使用java.sql.timestamp,java.sql.Date,java.util.Date和java.time.ZonedDateTime。我的Postgres仍然是「帶時區的時間戳」。但是因爲我使用Spring-Data-JPA並需要使用相同的類型進行查詢。如果我使用日期 - 應該是sql.Date或util.Date?

+0

它們仍然以UTC格式存儲,因爲Java Date ** **總是** ** ** **(如果它包含本地時區,則它已被格式化)。 –

+0

我想我不明白爲什麼數據庫以UTC格式顯示它們,甚至當作爲約會的一部分返回時,時間是UTC,但該區域似乎是「美國/丹佛」而不是「UTC」。我怎樣才能恢復正確的時間? – sonoerin

+0

你是如何顯示***時間的?因爲Java將Date從1970年1月1日UTC(即EPOCH)的午夜開始存儲爲毫秒。 –

回答

1

jdbc驅動程序有一些關於您當前所在時區的知識。通常,我通過讓數據庫爲我進行時區轉換來解決此問題,「時區無時區的時區戳在時區區域「或」具有時區時區的時間戳'UTC'「。它是postgres jdbc驅動程序的內核,它正在確定JVM所在的時區,並在保存中使用它。

+0

因此,您將您的列定義爲'UTC'時區,然後在實體和業務邏輯中使用LocalDateTime或ZonedDateTime?然後,當你返回你的數據時,你從該UTC轉換到所需的時區? – sonoerin

+0

有些時候,我將我的列定義爲時區類型的時間戳,然後當我堅持我的時代時,而不是僅僅做一個mycolumn =?,我會做類似mycolumn =?的事情。在'UTC'時區,事情變得有點棘手,因爲容易加倍考慮時間差異。如果您正在尋找一個良好的整體解決方案,另一種方法是將其設置爲jdbc圖層。使用諸如-Duser.timezone = UTC之類的jvm參數應該可以爲你做到這一點,並且它更容易,我只是不確定所有表格是否需要UTC或只是這個。 –

+0

因此經過一些研究後,由於我的OS/JVM環境變量,看起來值被保存爲MST而不是UTC。這是重寫我的轉換方法。因爲我使用Spring-Data-JPA w/Hibernate而不是PreparedStatements,有沒有辦法強制它在這個級別,或者我應該在啓動SpringBoot應用程序時使用它? – sonoerin