【发布时间】:2013-08-19 05:32:43
【问题描述】:
您好,我有一个酒店管理系统,对于不同的酒店(子域),需要不同的时区。我该怎么做?
【问题讨论】:
标签: python django django-forms
您好,我有一个酒店管理系统,对于不同的酒店(子域),需要不同的时区。我该怎么做?
【问题讨论】:
标签: python django django-forms
Django documentation regarding timezones 非常好。当您说您希望每个子域使用不同的时区时,您需要确切地确定您的意思。通常,Django TIME_ZONE 设置用于指定默认时区。但是,在您的情况下,您实际上需要不同的默认 TIME_ZONE 设置,具体取决于正在访问的子域。
实现这一目标的最稳健的方法可能是:
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 用户存储他们喜欢的时区来解决,并且中间件会根据文档中描述的会话数据来选择时区。
【讨论】:
以下代码可用于更改时区。
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 环境变量。