有什么方法可以在 postgres 中使用 datetime 存储偏移量(+03)?
是的,但正如@Andreas 所说,偏移量必须在单独的列中。 PostgreSQL 中的列类型名称timestamp with time zone 有点误导;真的只是timestamp converted to utc。原始偏移量不与时间戳值一起存储。
现在您可能想添加一个新的varchar 列并将偏移量保存为hh:mm 字符串,例如,
id twtz twtz_offset
-- ---------------------- -----------
1 2019-01-15 07:00:00+00 -07:00
但实际上最好使用ZoneOffset#getTotalSeconds() 提取偏移量以秒为单位 并将其存储在integer 列中,例如,
id twtz twtz_offset
-- ---------------------- -----------
1 2019-01-15 07:00:00+00 -25200
因为该数字可以直接应用于 UTC 值以转换回原始 OffsetDateTime,而无需将偏移量从 String 转换为 int
OffsetDateTime odtRetrieved = rs.getObject("twtz", OffsetDateTime.class); // always UTC for PostgreSQL
// odtRetrieved is 2019-01-15T07:00Z
OffsetDateTime odtOriginal = odtRetrieved
.toInstant()
.atOffset(ZoneOffset.ofTotalSeconds(rs.getInt("twtz_offset")));
// odtOriginal is 2019-01-15T00:00-07:00
而且它还提供了一些额外的稳健性,以防您发现自己处理一个实际上不是一整分钟的古怪偏移。
(如果您认为这永远不会发生,请留意 Jon Skeet 即将出版的科技/恐怖小说“时区规则几乎打破了我的大脑”。根据真实故事改编。即将在书店上市.)