gpt4 book ai didi

使用 Postgres 处理 Django 时区

转载 作者:行者123 更新时间:2023-11-29 13:34:33 24 4
gpt4 key购买 nike

我最近将 Django 项目从 1.3 升级到 1.5,以便开始使用时区处理。因为我是个白痴,所以我的 Django 时区被设置为“美国/纽约”而不是使用 UTC。 Turning Django's timezone support on automatically sets Postgres to UTC .现在我遇到了运行直接 SQL 查询的问题。我似乎无法正确过滤时区。这是我正在做的:

  1. 接受来自用户表单的时间戳字段
  2. 在我看来,使用 stamp.astimezone(timezone('UTC'))将其转换为 UTC
  3. 使用 django 在原始 SQL 查询中将其作为参数 (start.strftime('%Y-%m-%d %H:%M:00%z')) 传递。 db.connection 的游标

执行的查询(记录到控制台)看起来是正确的:

SELECT to_char(created, 'YYYY-MM-DD HH12:MIam'),
COALESCE(heat_flow_1, 0.0) / 1000.0, COALESCE(heat_flow_2, 0.0) / 1000.0,
COALESCE(heat_flow_3, 0.0) / 1000.0
FROM results_flattenedresponse
WHERE installation_id = '66'
AND created BETWEEN TIMESTAMPTZ '2013-04-26 13:00:00+0000' AND TIMESTAMPTZ '2013-04-26 16:00:00+0000'

如果我将它复制并粘贴到 PGAdmin 中,我就会得到我要找的东西,一组从美国东部时间上午 9 点开始的行。但是,从 django.db.connection 的游标返回的数据集的所有日期都提前了 4 小时(EDT 和 UTC 之间的差异)。其余数据实际上是正确的,但日期被视为 UTC 并推送到用户的事件时区(即使我调用停用)。我觉得我现在想解决这个问题的想法是一堆乱七八糟的想法,所以我不确定哪些部分是好想法,哪些是坏想法。

编辑/更新

我已经在这里尝试了很多其他的事情,但仍然得到了不好的结果,但只有当我直接查询数据库时才会这样。上面第 2 步和第 3 步中的内容似乎无关紧要。我能看到的一个快速修复实际上是在查询中设置时区,例如 SET timezone='America/New_York'; 然后撤消它,但这对于数据完整性来说似乎是一个非常糟糕的主意。

另一个奇怪的地方:我已经将 Django 时区设置为 UTC,但是当我下载本地副本并查看数据时,它仍然被标记为好像设置为 America/New_York。我不知道这是由于我的本地服务器上的设置造成的,还是存在 Django 将数据插入第二个(非默认)数据库时数据未正确本地化的错误,尽管如果那是如果我希望我的问题会消失。

最佳答案

由于服务器现在是 UTC 时间,创建的默认返回为 UTC,所以第一位需要是

SELECT to_char(created AT TIME ZONE %s, 'YYYY-MM-DD HH12:MIam')

然后传入你想看的时区。这不是世界上最好的方法,但它在这里对我有用,因为查询都在一个对象内运行,该对象具有相关时区作为属性。

关于使用 Postgres 处理 Django 时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16287570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com