这是一个好你在UTC
存储的一切。现在,您不需要将用户时区存储在数据库中,您可以执行的操作是在登录页面上,您可以从UTC
计算用户偏移量并存储在会话vi ajax中。下面是一个简单的脚本,您可以在您的登录页面模板:
<script>
$(document).ready(function(){
var visitortime = new Date();
var visitortimezone = - visitortime.getTimezoneOffset()/60;
$.ajax({
type: "POST",
url: "{% url 'update_timezone' %}",
data: {'time_zone': visitortimezone, 'csrfmiddlewaretoken': '{{csrf_token}}'},
dataType: "text"
});
});
</script>
添加的网址,你的根urls.py:
url(r'^update_timezone/$',
'MySite.views.update_timezone',
name='update_timezone'),
添加这样的观点:
def update_timezone(request):
time_zone = request.POST.get('time_zone', 0)
if time_zone:
request.session['user_timezone_offset'] = float(time_zone)*60*60
return HttpResponse(
simplejson.dumps({}), mimetype='application/javascript')
现在会话中有用户时区偏移量。现在来计算的部分。如果你想根据他/她的时区,你会做向用户显示时间
from datetime import timedelta
def add_user_offset(dt, offset):
if offset:
dt = dt + timedelta(seconds=offset)
return dt
def subtract_user_offset(dt, offset):
if offset:
dt = dt - timedelta(seconds=offset)
return dt
好:您需要这两个简单的辅助功能
created = add_user_offset(obj.created, request.session.get('user_timezone_offset'))
如果您有日期时间或日期的到来表单,你想验证它,例如选择应不低于当前的日期,你会做的日期:
from django.utils import timezone
d = request.POST['date']
d_normalize = subtract_user_offset(d, request.session.get('user_timezone_offset'))
if d_normalize < timezone.now():
raise Exception, 'Date must be in future'
这种方法的好处是,你不需要让用户可以给指定的时区。我们正在自动处理所有事情。
看看http://pytz.sourceforge.net/ –