如何在Django中设置不同的时区

Pra*_*eep 3 python django django-forms

嗨我有一个酒店管理系统,在这个不同的酒店(子域)不同的时区是必需的.我怎样才能做到这一点?

Aus*_*ips 9

关于时区的Django文档很精彩.当您说您希望每个子域名具有不同的时区时,您需要准确确定您的意思.通常,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()
Run Code Online (Sandbox Code Playgroud)

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