这是django timezone的来源
将以下中间件添加到 MIDDLEWARE:
import pytz
from django.utils import timezone
class TimezoneMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
tzname = request.session.get('django_timezone')
if tzname:
timezone.activate(pytz.timezone(tzname))
else:
timezone.deactivate()
return self.get_response(request)
创建一个可以设置当前时区的视图:
from django.shortcuts import redirect, render
def set_timezone(request):
if request.method == 'POST':
request.session['django_timezone'] = request.POST['timezone']
return redirect('/')
else:
return render(request, 'template.html', {'timezones': pytz.common_timezones})
在 template.html 中包含一个将 POST 到此视图的表单:
{% load tz %}
{% get_current_timezone as TIME_ZONE %}
<form action="{% url 'set_timezone' %}" method="POST">
{% csrf_token %}
<label for="timezone">Time zone:</label>
<select name="timezone">
{% for tz in timezones %}
<option value="{{ tz }}"{% if tz == TIME_ZONE %} selected{% endif %}>{{ tz }}</option>
{% endfor %}
</select>
<input type="submit" value="Set">
</form>
表单中的时区感知输入¶
当您启用时区支持时,Django 会解释在当前时区的表单中输入的日期时间,并在 clean_data 中返回可感知的日期时间对象。
如果当前时区由于处于 DST 转换中而引发不存在或不明确的日期时间异常(pytz 提供的时区会执行此操作),则此类日期时间将被报告为无效值。
模板中的时区感知输出¶
当您启用时区支持时,Django 在模板中呈现时会将可感知的日期时间对象转换为当前时区。这与格式本地化非常相似。
警告
Django 不会转换原始日期时间对象,因为它们可能是模棱两可的,而且当启用时区支持时,您的代码不应该生成原始日期时间。但是,您可以使用下面描述的模板过滤器强制转换。
转换为本地时间并不总是合适的——您可能会为计算机而不是人类生成输出。 tz 模板标签库提供的以下过滤器和标签允许您控制时区转换。
模板标签¶
当地时间¶
在包含的块中启用或禁用感知日期时间对象到当前时区的转换。
就模板引擎而言,此标记与 USE_TZ 设置的效果完全相同。它允许对转换进行更细粒度的控制。
要激活或停用模板块的转换,请使用:
{% load tz %}
{% localtime on %}
{{ value }}
{% endlocaltime %}
{% localtime off %}
{{ value }}
{% endlocaltime %}
注意
USE_TZ 的值在 {% localtime %} 块内不受尊重。
时区¶
设置或取消设置包含块中的当前时区。未设置当前时区时,将应用默认时区。
{% load tz %}
{% timezone "Europe/Paris" %}
Paris time: {{ value }}
{% endtimezone %}
{% timezone None %}
Server time: {{ value }}
{% endtimezone %}
get_current_timezone¶
您可以使用 get_current_timezone 标签获取当前时区的名称:
{% get_current_timezone as TIME_ZONE %}
或者,您可以激活 tz() 上下文处理器并使用 TIME_ZONE 上下文变量。