【问题标题】:Postgres TIME vs TIME with Time zonePostgres TIME 与 TIME 与时区
【发布时间】:2018-08-03 13:56:40
【问题描述】:

谁能解释一下 Postgres 在处理以下情况时应用的逻辑。

Django 视图接收以下格式的时间字符串表示:

18:30 PM

然后它坚持到 Postgres。我在数据库中创建了 2 列,以突出处理上述时间的差异:

start_at time NOT NULL,
start_at_tz timetz NOT NULL,

以下是保存在 DB 中的内容:

行为似乎是应用于时区列的 7 小时差异。值格式似乎没有包含 24 小时/天的截止时间。

较早的时间被转换为:

下午 13:00

下午 14:00

有人可以解释一下 PostgreSQL 的行为吗?我在 EST 时区,如果相关的话。

提前谢谢你。

【问题讨论】:

  • 就像文档说的那样,time with time zone 之所以存在是因为标准是这样说的,但它被概念所破坏。不要使用它。
  • @LaurenzAlbe:您介意详细说明一下吗?
  • 在答案中完成。

标签: django postgresql timezone


【解决方案1】:

似乎插入值的数据库会话运行时使用的 timezone 值与用于显示值的会话不同。

time with time zone 被解释为当天的会话时区,并存储为自 UTC 午夜以来的时间。

你不应该使用time with time zone,就像the documentation说的:

time with time zone 类型是由 SQL 标准定义的,但该定义显示的属性会导致有用性受到质疑。在大多数情况下,datetimetimestamp without time zonetimestamp with time zone 的组合应提供任何应用程序所需的完整范围的日期/时间功能。

时区仅与日期结合使用才有意义,因为在一年中存在偏移量变化的时区。如果您处于这样的时区,time with time zone 的显示值将在一年中有所不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2013-10-14
    • 2012-07-22
    相关资源
    最近更新 更多