後續問題到我原來的issue。Postgres 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?
它們仍然以UTC格式存儲,因爲Java Date ** **總是** ** ** **(如果它包含本地時區,則它已被格式化)。 –
我想我不明白爲什麼數據庫以UTC格式顯示它們,甚至當作爲約會的一部分返回時,時間是UTC,但該區域似乎是「美國/丹佛」而不是「UTC」。我怎樣才能恢復正確的時間? – sonoerin
你是如何顯示***時間的?因爲Java將Date從1970年1月1日UTC(即EPOCH)的午夜開始存儲爲毫秒。 –