2017-04-07 82 views
1

我运行Django的服务器,而无需任何代理:如何在http响应(django服务器)中更改时区?

python manage.py runserver 0.0.0.0:80 

设置我的本地时区的Linux服务器上,它是正确的:

[email protected]:/app# date 
Fri Apr 7 12:38:42 MSK 2017 

我设立本地时区在我的Django的settings.py项目:

TIME_ZONE = 'Europe/Moscow' 

,并检查它:

>>> from django.utils.timezone import localtime, now 
>>> localtime(now()) 
datetime.datetime(2017, 4, 7, 12, 38, 42, 196476, 
tzinfo=<DstTzInfo 'Europe/Moscow' MSK+3:00:00 STD>) 

但是当我打开任何网页从客户(谷歌Chrome浏览器) - 在HTTP响应头时区不在本地:

Date:Fri, 07 Apr 2017 09:38:42 GMT 

我如何更改HTTP头时区的全球所有项目?

回答

0

我怎样才能改变HTTP头时区的全球所有项目?

HTTP日期头是defined在UTC是(用字符GMT表示由于历史的原因),所以既不Django的或任何其他的服务器或框架将允许你将它们定位到您的时区。你有这样的理由吗?

Django确实有办法切换到本地时区(请参阅activate()),但这只适用于特定于应用程序的内容,而不适用于HTTP标头。

+0

谢谢,没有理由将它们本地化。我只想知道他们为什么使用UTC。您的答案和IETF参考帮助。 – xtdwps

1

使用pytz,作为astimezone方法

from pytz import timezone 

time_zone = timezone(settings.TIME_ZONE) 
currentTime = currentTime.astimezone(time_zone) 

在你的中间件:

import pytz 

from django.utils import timezone 
from django.utils.deprecation import MiddlewareMixin 

class TimezoneMiddleware(MiddlewareMixin): 
    def process_request(self, request): 
     tzname = request.session.get('django_timezone') 
     if tzname: 
      timezone.activate(pytz.timezone(tzname)) 
     else: 
      timezone.deactivate() 

在你view.py

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}) 

在你templete.html

{% 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="selected"{% endif %}>{{ tz }}</option> 
     {% endfor %} 
    </select> 
    <input type="submit" value="Set" /> 
</form> 
+0

我应该把这个代码放在哪里?什么是在赋值中引用的currentTime变量? – xtdwps

+0

@xtdwps:我已经更新了答案请看看 – Surajano

+0

官方Django文档的链接:https://docs.djangoproject.com/en/2.0/topics/i18n/timezones/ –