【问题标题】:How to set different Time zones in Django如何在 Django 中设置不同的时区
【发布时间】:2013-08-19 05:32:43
【问题描述】:

您好,我有一个酒店管理系统,对于不同的酒店(子域),需要不同的时区。我该怎么做?

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    Django documentation regarding timezones 非常好。当您说您希望每个子域使用不同的时区时,您需要确切地确定您的意思。通常,Django TIME_ZONE 设置用于指定默认时区。但是,在您的情况下,您实际上需要不同的默认 TIME_ZONE 设置,具体取决于正在访问的子域。

    实现这一目标的最稳健的方法可能是:

    • 始终将日期存储在您的 UTC 中,与分配给子域的时区无关。
    • 编写一些自定义 Django 中间件,用于设置每个请求到达时使用的默认时区。上面链接的 Django 文档给出了一个示例。这是一个例子:
    import django.utils.timezone
    from pytz import timezone
    
    class TimezoneMiddleware(object):
        def process_request(self, request):
            # Put logic here to choose timezone based on domain.
            if request.META['HTTP_HOST'] == 'hotel1.subdomain.com':
                tz = timezone('US/Eastern')
            else:
                tz = timezone('UTC')
    
            if tz:
                django.utils.timezone.activate(tz)
            else:
                django.utils.timezone.deactivate()
    

    现在,当 Django 处理输入或显示的日期时,它将使用中间件选择的时区。这并不能解决用户处于与设置时区的子域不同的时区的问题。通常,这个问题可以通过让每个 Django 用户存储他们喜欢的时区来解决,并且中间件会根据文档中描述的会话数据来选择时区。

    【讨论】:

    • 非常感谢,这正是我要找的,再次感谢
    • @Austin 这个 tz 将只在这个会话中激活吗?如果有多个并发请求怎么办?
    • @AnuragRana tz 将只为这个 request 激活(不是会话)。 django 时区激活/停用功能使用线程本地存储来存储当前激活的时区,以支持并发请求,每个请求都可能有自己的时区。当前的 Django 文档包含比此答案中给出的更新的中间件示例。
    【解决方案2】:

    以下代码可用于更改时区。

    import os,time
    
    os.environ['TZ'] = 'Asia/Shanghai'
    

    http://en.wikipedia.org/wiki/List_of_tz_database_time_zones 中有一个时区列表。

    Pytz 是在 python 中管理时区的另一个不错的选择。

    【讨论】:

    • 如果使用此方法,请注意您可能需要在设置TZ 后调用time.tzset()。此外,当部署在使用同一进程中的不同线程处理不同请求的 web 服务器环境中时,使用这样的全局变量可能会发生环境冲突。因为TZ 在这种情况下实际上是一个全局变量,您可能会发现在另一个线程中处理的请求会覆盖您自己线程的TZ 环境变量。
    猜你喜欢
    • 2015-06-01
    • 2012-10-19
    • 2020-07-23
    • 2018-06-27
    • 1970-01-01
    • 2018-07-21
    • 2015-11-25
    • 1970-01-01
    • 2016-02-23
    相关资源
    最近更新 更多