Django 时区混淆;Postgres 和 Apache

4
设置:在同一组服务器上使用Django运行多个站点,并由相同的Apache进程组提供服务。一些站点位于东部时区,一些站点位于中部时区。数据库是在单独的服务器上运行的PSQL。
当我开始时,并没有考虑各个站点如何处理时区;我想我只是看到了Django中的TIMEZONE设置,认为它会“处理好”。现在我看到了问题的破绽。
第一个问题:时区似乎在东部和中部之间来回切换。从这个网站搜索到的我的理解是,这是因为TZ的os环境变量根据Apache进程设置,具体取决于它正在处理请求的哪个Django站点,如果该进程然后处理另一个TZ的站点的请求,则时区就会出错。我认为我在这里找到的解决方案是不同时区的站点需要有不同的进程组为其提供服务。如果有误请纠正。
第二个问题:在Linux本地,我从一个中部时间的站点上运行了./manage.py runserver(我在东部)。我创建了一个资产,其发布日期在管理界面中正确显示为比实际时间早一小时。查看实际的PostgresSQL条目,发布日期的时区仍然列为-04。Postgres是否只使用服务器/计算机本身的时区,而忽略Django中的任何TZ设置?因此,在东部时间上保存在Postgres服务器上的所有条目都将显示为-04或-05,具体取决于夏令时?
如果有其他人遇到过类似的问题,欢迎提供建议。即使我将中部站点的Apache进程拆分出来,以使其TZ设置不会跨越,我仍然需要解决Postgres的问题。然后我很好奇;如果PSQL时间戳是中部时间,而TZ设置是东部时间,比如说,日期时间字段是否考虑了TZ?也就是说,如果你在Django设置为EST时执行datetime.datetime.now(),它返回2:00 PM,那么你将根据其发布日期早于那个结果来过滤内容,它是否通过只查找发布时间早于1:00PM CST或更早的内容来考虑TZ?
1个回答

2
以下是翻译的结果:

以下是有关Django和Postgres中时区处理的一些详细信息,但我强烈建议在后端仅使用UTC,并仅在前端将UTC时间戳呈现给用户时才转换为本地时区。在Python中,您可以通过datetime.datetime.utcnow()获取当前UTC时间。我甚至将我的服务器设置为UTC时区,但这并不是严格必要的。

在Django中,多个时区无法很好地工作;请参见此票据。 Python标准库中的datetime对象是时区无关的,您需要像pytz这样的库来解决这个问题,但据我所知,Django仍然返回无时区意识的datetime对象,而不是您可以使用pytz构造的有时区意识的对象。

Postgres将检查几个位置以确定时区,包括TZ环境变量,但TZ必须在postgres进程的环境中:

PostgreSQL 8.5.3. 时区

如果未在postgresql.conf或作为postmaster命令行开关中指定时区,则服务器将尝试使用TZ环境变量的值作为默认时区。如果未定义TZ或不是PostgreSQL已知的任何时区名称,则服务器将尝试通过检查C库函数localtime()的行为来确定操作系统的默认时区。默认时区是在PostgreSQL已知的时区中选择最接近的匹配项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接