在创建系统后端时,我总是将时间存储在 UTC 中,即客户端发送任何日期时间时,我限制只接受 UTC 日期时间,客户端将其本地日期时间转换为 UTC,然后使用API。
然后我将 utc 日期时间存储到数据库中,我从不关心时区。然后,当用户询问日期时间时,我给他们我存储的 UTC 时间,然后他们将其转换回本地时区,这对我来说看起来很棒。
我的问题是,
这些类型的命名令人困惑。类型
timestamptz
不 在数据库中存储时区。它仅意味着“我将接受输入中的时区并在存储中转换为 UTC”和“当您请求时,我将返回转换为设置时区的 UTC 数据。”
文档在时间戳部分解释了这一点,但顶部的表格实际上根本没有说清楚,这是一个常见的困惑。
所以两者都不能用来存储实际的时区信息。
至于何时需要存储时区,日历应用程序是一件大事。想象一下,您在每周二 14 点在一个实行夏令时的地点有个约会。除非你说出时区并且可以在必要时正确转换为其他时区,否则你怎么知道每周二的 14 点是多少?仅仅保存 UTC 就意味着半年已经结束了。
使用哪个?
timestamptz
经常被推荐,例如 Npgsql 库指出这是最好的方法。这听起来很奇怪,因为“我只想要没有时区的 UTC”,但这正是该类型带来的 - 无论命名如何。