【问题标题】:How to stop django postgresql timestramp conversion如何停止 django postgresql 时间戳转换
【发布时间】:2019-07-15 06:11:46
【问题描述】:

当我在 EST (2019-02-21 05:37:46) 中将时间戳插入 Postgres 表中并且在 Postgresql 表中存储在 IST (2019-02-21 16:07:46) 中时。我希望时间仅存储在 EST 中。谁能帮我解决这个问题?

【问题讨论】:

  • USE_TZTIME_ZONE 的设置是什么?阅读 this 以了解 Django 如何使用时区。请注意,您的数据库时间戳仍然是正确的时间,并且在获取它时它将反映用户时区中的正确时间。
  • 您也应该不想只存储在 EST 中。您正在使用 PostgreSQL,您应该以 UTC 时间存储。这是因为在 EST 时区,夏季有夏令时 (DST),因此当时间跳跃时,您可能会出现错误行为(特别是因为时钟返回时有一个小时的重叠)。直接查询为您提供 IST 中的时间戳这一事实并不意味着时间存储在 IST 中,而是存储在 UTC 中。它显示 IST 可能是因为它托管在 IST 时区的服务器上。
  • @dirkgroten 所以,当我将 EST 时间摄取到 Postgres 时,它存储为 UTC 对吗?在我的 settings.py 中:TIME_ZONE = 'EST' USE_I18N = True USE_L10N = True USE_TZ = False
  • 我认为在使用 Postgresql 时将 USE_TZ 设置为 False 是个坏主意,因为默认情况下它是时区感知的。您冒着未正确传递时区并保存错误时间的风险(如果您将天真的日期时间传递给 postgres,它将假定它是 UTC)。如果我是你,我会切换到 True。是的,如果你给它一个感知的日期时间对象,它会正确地存储为 UTC。见this
  • 好的,谢谢你的信息@dirkgroten

标签: django python-3.x postgresql django-rest-framework django-views


【解决方案1】:

在 postgres 中,您可以使用 set n postgres 更改 datetimes 的默认格式掩码,您可以使用 set datestyle 更改日期时间的默认格式掩码

更多详情请关注link

也可以参考这个link

据我所知,PostgreSQL 中没有默认设置会从时间戳文字中删除秒数

【讨论】:

    【解决方案2】:

    一般而言,您应该以 UTC 格式处理所有日期时间,因为这些是始终正确的绝对时间戳。即使您只打算让 EST 时区的用户使用您的网站,EST 时区在夏季也有夏令时 (DST),因此当时间跳跃时您可能会出现错误行为(尤其是因为存在重叠时钟倒退一小时)。这意味着:

    • 您的代码应使用 UTC 时间戳进行计算和传递
    • 您的数据库应该存储 UTC 日期时间(PostgreSQL 无论如何都会这样做)。

    在向用户显示数据时,您应该只转换到本地时区。这是 Django 中的默认行为:

    • 默认USE_TZ = True
    • TIME_ZONE = "America/New_York" 设置默认时区,将考虑 DST

    因此,当您将时间感知日期时间保存到数据库时(以 EST 为例),数据库会将其存储为 UTC。当您获取并显示它时,Django 将在用户的当前时区(在您的情况下为 EST)显示它。当您使用工具直接查询数据库时,PostgreSQL 会返回 UTC,即正确的日期时间,但您的 shell 或工具可能会以本地时区显示它。您可以使用@c.grey 在另一个答案中发布的链接格式化您的查询以使用不同的时区。

    阅读详情here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 2020-01-16
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      相关资源
      最近更新 更多