我最近将一个Django项目从1.3升级到1.5,以便开始使用时区处理。因为我是一个白痴,我的Django时区设置为"美国/纽约",而不是使用UTC。打开Django的时区支持会自动将Postgres设置为UTC。现在我遇到了直接运行SQL查询的问题。我似乎无法使时区过滤正确。下面是我正在做的:
- 接受来自用户表单的时间戳字段
- 在我的视图中用
stamp.astimezone(timezone('UTC'))
交换到UTC - 在使用django.db的原始SQL查询中将其作为参数(
start.strftime('%Y-%m-%d %H:%M:00%z')
)传递。连接的光标
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.数据库返回的数据集。连接的游标将所有日期向前推4小时(EDT和UTC之间的差)。其余的数据实际上是正确的,但是日期被视为UTC并被推送到用户的活动时区(即使我调用deactivate)。我觉得我现在有一堆糟糕的想法连接在一起,试图解决这个问题,所以我不确定哪些部分是好主意,哪些是坏主意。
编辑/更新
我一直在尝试一些其他的事情在这里,仍然得到不好的结果,但只有当我直接查询数据库。上述步骤2和3中的内容似乎无关紧要。我能看到的一个快速修复实际上是在查询中设置时区,例如,SET timezone='America/New_York';
,然后撤销它,但这似乎是一个非常糟糕的数据完整性的主意。
另一个奇怪的地方:我已经将Django的时区设置为UTC,但是当我下载一个本地副本并查看数据时,它仍然被标记为好像设置为America/New_York。我不知道这是由于我的本地服务器上的设置,或者如果有一个错误,当数据被插入到第二个(非默认)数据库时,数据没有被Django正确地本地化,尽管如果是这样的话,我希望我的问题就会消失。
由于服务器现在使用的是UTC时间,因此在默认情况下,created返回为UTC时间,因此第一个位需要是
SELECT to_char(created AT TIME ZONE %s, 'YYYY-MM-DD HH12:MIam')
并传入您想要看到的时区。这不是世界上最好的方法,但它在这里对我来说是有效的,因为查询都是在一个对象中运行的,该对象将相关时区作为属性。