【发布时间】:2019-09-21 19:16:40
【问题描述】:
在 Postgres 中,我存储用户提供给我的数据:
Column | Type | Collation | Nullable | Default
------------+--------------------------+-----------+----------+---------
id | uuid | | not null |
value | numeric | | |
date | timestamp with time zone | | |
现在我提出了维护生成数据的原始时区的要求。 timestamp with timezone 被规范化为数据库的时区,原始时区丢失了,所以我必须手动将 date 从规范化的时区恢复回来,然后再将其返回给用户。
大多数解决方案建议在表中添加一个额外的列,并将原始时区信息与时间戳一起存储:
Column | Type | Collation | Nullable | Default
------------+--------------------------+-----------+----------+---------
id | uuid | | not null |
value | numeric | | |
date | timestamp with time zone | | |
tz | text | | |
因此,鉴于我正在使用 Go,我应该从 time.Time 中提取哪些信息以存储在 tz 中以进行最精确和无缝的恢复?
date.Location().String() 似乎不正确,因为它可能返回相对的值 Local。
我应该如何将tz的信息恢复到time.Time?
time.LoadLocation(tz) 的结果够好吗?
【问题讨论】:
-
github.com/lib/pq驱动程序声明它“正确扫描time.Time(即timestamp[tz]、time[tz]、date)”。因此,如果在数据库中有timestamp with time zone类型的列,这应该会自动发生,不是吗? -
是的,我也应该提到这一点 -
timestamp with time zone将采用时区时间戳,将其更正为数据库时区,然后存储。它基本上只会让您在保存之前避免标准化到数据库时区。它实际上并没有保留原始时区数据,因此当您查询回信息时,它仍会出现在 DBs 时区中,除非查询指定不同的时区 -
是否需要对恢复的时间戳应用操作?例如添加天数或计算自此经过的时间?
-
是的,但仅限于彼此相关的批次内。我可以放心地假设,在对时间戳执行操作(例如持续时间)时,所有相关时间戳都在同一个时区。此数据的其他批次可能位于不同的时区
标签: postgresql datetime go time timezone