问题描述
在 Django 中,您有一个 TIME_ZONE 设置,据我所知,它以某种方式在运行时修补标准日期和时间包,使它们认为应用程序在指定的时区中工作。因此,用于确定本地时区的通用 Python methods 不起作用(它们仅显示配置的时区)。
我可以像在 this answer 中一样评估 /etc/localtime
的链接或使用其他 Linux 特定的方法,但我担心可移植性问题,因为一些开发人员在 Windows 上运行该应用程序。
我能否以独立于平台的方式找出机器上的原始时区?
解决方法
由于没有答案,我将在此处发布解决方法。
虽然我们无法恢复初始时区(不影响当前设置),但我们可以在Django初始化之前获取并保存它。例如:
- 为了在本地运行,我们可以增加
manage.py
:
cmd = sys.argv[1] if len(sys.argv) >= 2 else ""
if cmd == "runserver":
from tzlocal import get_localzone
os.environ['MACHINE_TIME_ZONE'] = get_localzone().tzname(None)
# ...
execute_from_command_line(sys.argv)
- 对于生产,方式取决于您如何启动应用程序。例如,如果您使用的是 Gunicorn,则可以将其放入
gunicorn.conf.py
或wsgi.py
。主要的是你在加载 Django 库之前把它放在某个地方:
from tzlocal import get_localzone
os.environ['MACHINE_TIME_ZONE'] = get_localzone().tzname(None)
稍后您可以访问此环境变量以检索值。