【问题标题】:How to get the original local machine time zone in a Django application?如何在 Django 应用程序中获取原始本地机器时区?
【发布时间】:2021-06-01 14:15:29
【问题描述】:

在 Django 中,您有一个 TIME_ZONE 设置,据我了解,它以某种方式在运行时修补标准日期和时间包,使他们认为应用程序在指定的时区工作。因此,用于确定本地时区的通用 Python methods 不起作用(它们只显示配置的时区)。

我可以像this answer 一样评估/etc/localtime 的链接,或者使用其他Linux 特定的方法,但我担心可移植性问题,因为一些开发人员在Windows 上运行该应用程序。

我能否以独立于平台的方式找出机器上的原始时区?

【问题讨论】:

  • “本地机器”是什么意思?我们是在谈论运行 Django 应用程序的服务器还是浏览应用程序的客户端机器?
  • @Selcuk 我应该更具体一点:运行 Django 服务器应用程序的操作系统用户帐户中的时区设置。
  • Django 设置了一个环境变量,但不修补任何东西。您可以尝试使用tzlocal 包来获取 windows 和 unix 上的服务器时区。
  • @KevinChristopherHenry 也许我遗漏了一些东西,但就像我在我的问题中发布的那样,提供的链接(包括 tzlocal 包)的每个方法都会返回在TIME_ZONE 中配置的区域。除了更改标准包之外,我不知道如何解释它。例如。 datetime.now().astimezone().tzinfo 在纯 Python 中显示正确的时区,但在运行 Django 应用程序时显示 TIME_ZONE 时区。
  • @KevinChristopherHenry 文档对此提供了一些见解:“在 Unix 环境中,Django 将 os.environ['TZ'] 变量设置为您在 TIME_ZONE 设置中指定的时区”。这似乎会影响标准日期/时间包的工作。问题是如何回退到获取时区的默认方法,而不影响使用日期/时间函数的其他地方。

标签: python django timezone django-timezone


【解决方案1】:

由于没有答案,我将在此处发布解决方法。

虽然我们无法恢复初始时区(不影响当前设置),但我们可以在 Django 初始化之前获取并保存它。例如:

  1. 为了在本地运行,我们可以扩充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)
  1. 对于生产,方式取决于您启动应用程序的方式。例如,如果您使用 Gunicorn,则可以将其放入 gunicorn.conf.pywsgi.py。最主要的是在加载 Django 库之前把它放在某个地方:
from tzlocal import get_localzone
os.environ['MACHINE_TIME_ZONE'] = get_localzone().tzname(None)

稍后您可以访问此环境变量来检索值。

【讨论】:

    猜你喜欢
    • 2016-06-29
    • 2013-01-17
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 2019-05-28
    • 2012-11-19
    相关资源
    最近更新 更多