【问题标题】:Django Timezone UTCDjango 时区 UTC
【发布时间】:2014-02-19 15:05:11
【问题描述】:

我目前正在使用 postgres 数据库开发 Django 项目。 使用朴素时间(用户的本地时间)存储在带有时间戳的数据库中的数据。 然而,在setting.py中,我们有

USE_TZ = True

这意味着 Django ORM 检索到的所有时间戳都转换为 UTC。

一般情况下是可以的。但是,对于我现在正在构建的功能确实需要实时(uesr 的本地时间)。当然,我会获取数据并将时间转换为我想要的任何时间,但有两个问题: 1.我可以把时间戳转换成EST什么的,但是我还是不知道原来的时间; 2. 我想在 ORM 查询期间而不是之后进行转换,因为这样会更有效率。

有人知道这件事吗? 提前致谢!

【问题讨论】:

  • 根据您的项目,建议在客户端转换为本地时间(使用 javascript)
  • @goncalopp:我正在处理客户端问题。我正在尝试分析db的日志表(日志表由我定义)。日志中有一个时间戳字段,用于记录客户端发生某些事情的时间。我想要那个时间,但 django 给了我 UTC。我可以通过 psql 或 django 原始查询获取该时间,但不能通过 django orm 获取。在我开始执行 orm 查询时或之前,我需要一种将所有时间转换为原始时间的方法。

标签: python django postgresql orm timezone


【解决方案1】:

1) 如果原始日期时间真的很幼稚,那么我会假设它们被存储为您在TIME_ZONE 设置中设置的任何时区(默认为'America/Chicago',但在您的情况下可能是其他的)。所以转换回那个时区可能会给你原来的时间。来自 django 文档:

"当 USE_TZ 为 False 时,这是 Django 将在哪个时区 存储所有日期时间。当 USE_TZ 为 True 时,这是默认时间 Django 将用于在模板中显示日期时间的区域 解释表单中输入的日期时间。”

(https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-TIME_ZONE)

通常,时区信息实际上是在 db 连接 (https://docs.djangoproject.com/en/dev/ref/databases/#optimizing-postgresql-s-configuration) 上设置的,因此当您通过 psql 连接到 postgres 时,预计您的日期时间不会采用 UTC,因为使用的时区将默认为您系统的时区,我不确定为什么 django 中的原始查询不会发生这种情况。

2) 我不能说我已经做了很多小时的研究,但是我相信设置USE_TZ 注定你必须转换后查询。您可以覆盖连接时区,但我不知道在运行时执行此操作的简单方法,因为由于USE_TZ,它将默认为UTC。

在我之前从事的项目中遇到过类似的问题,我们要么按照您的 cmets 中的建议将责任移交给前端(前端返回 UTC 日期时间并将数据从 UTC 转换回来),要么我们还存储用户时区并进行查询后转换。这在我们的用例中并没有被证明是低效的。

【讨论】:

  • 感谢您的回答。其实我知道你在说什么。关键是我正在尝试对日志表和 GROUP BY DAY 执行 orm 查询,这导致了整个问题。因为 db 中的“DAY”概念是由用户的本地时间定义的,而不是 UTC。但是,当我尝试按天对数据进行分组时,其中一些会跨越午夜,而被 django 转换。这就是我说我想在执行 orm 查询之前将时间转换为原始版本的原因。有什么线索吗?
  • 我认为您可以在 SQL 中使用 AT TIME ZONE 语句按天对数据进行分组,但您可能不得不求助于原始查询而不是 orm。
  • 这就是我所担心的。在我的情况下,原始查询是不可接受的。将继续工作。谢谢你的建议!
猜你喜欢
  • 1970-01-01
  • 2020-02-06
  • 2018-04-02
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 2021-12-24
  • 1970-01-01
相关资源
最近更新 更多