gpt4 book ai didi

python - Django 时区困惑; Postgres 和 Apache

转载 作者:太空宇宙 更新时间:2023-11-03 11:36:05 25 4
gpt4 key购买 nike

设置:Django 上的多个站点位于同一组服务器上,由同一组 Apache 进程提供服务。一些网站是东部 TZ;有些是中央的。数据库是在单独的服务器上运行的 PSQL。

开始时,我并没有过多考虑各个站点如何处理时区;我想我在 Django 中看到了 TIMEZONE 设置,只是认为它会“处理它”。现在我看到了裂缝。

第一个问题:时区似乎在东部和中部之间来回翻转。通过在该站点上搜索,我对此的理解是,这是因为 TZ 的 os environ var 被设置为 Apache 进程,具体取决于它正在处理哪个 Django 站点的请求,如果该进程随后处理另一个站点的请求TZ,时区错误。我相信我在这里找到的解决方案是不同时区的站点需要有不同的进程组为它们服务。错误请指正。

第二个问题:在本地 Linux 上,我使用中部时间(我在东部时间)从我的一个站点执行了 ./manage.py runserver。我创建了一个 Assets ,其发布日期在管理员中正确显示为晚一小时。查看实际的 PostgresSQL 条目,发布日期的时区仍列为 -04。 Postgres 是否只使用服务器/计算机本身的时区而忽略 Django 中的任何 TZ 设置?因此,根据夏令时,东部时间保存在 Postgres 服务器上的所有条目都将显示为 -04 或 -05?

如果有其他人处理过类似的事情,我们将不胜感激。即使我为中心站点拆分 Apache 进程,使它们的 TZ 设置不交叉,我仍然有 Postgres 问题需要处理。然后我很好奇;如果 PSQL 时间戳是 Central,而 TZ 设置是 Eastern,比如说,日期时间字段是否考虑了 TZ?即,如果您在 Django 设置为 EST 时执行 datetime.datetime.now() 并且它返回下午 2:00,那么您让它通过发布日期小于该结果的内容来过滤内容,它是否仅考虑 TZ寻找发布时间为美国中部标准时间下午 1:00 或更早的内容?

最佳答案

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

多时区在 Django 中效果不佳;见this ticket . Python 标准库中的日期时间对象是时区原始对象,您需要像 pytz 这样的库来解决这个问题,但据我所知,Django 仍然返回原始日期时间对象,而不是您可以使用 pytz 构建的时区感知对象。

Postgres 会检查几个地方来确定时区,包括 TZ 环境变量,但 TZ 必须在 postgres 进程的环境中:

PostgreSQL 8.5.3。时区

If timezone is not specified in postgresql.conf nor as a postmaster command-line switch, the server attempts to use the value of the TZ environment variable as the default time zone. If TZ is not defined or is not any of the time zone names known to PostgreSQL, the server attempts to determine the operating system's default time zone by checking the behavior of the C library function localtime(). The default time zone is selected as the closest match among PostgreSQL's known time zones.

关于python - Django 时区困惑; Postgres 和 Apache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2518240/

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