Django时区问题

问题描述

在我的Django应用程序中,TimeZones有很多麻烦。

出于解释目的,我将直接跳至示例:

我有一个具有TimeField(null = True,blank = True)的对象,基本上我想根据用户的时区显示此时间。

我有一个Middleware类,该类可将时区激活给经过身份验证的用户

#'middleware.py'


import pytz

from django.utils import timezone


class TimezoneMiddleware(object):
    """
    Middleware to properly handle the users timezone
    """

    def __init__(self,get_response):
        self.get_response = get_response

    def __call__(self,request):
        if request.user.is_authenticated:
            timezone.activate(pytz.timezone(request.user.timezone))
        else:
            timezone.deactivate()

        response = self.get_response(request)
        return response

接下来,我将从用户模型字段timezone = models.CharField(max_length=128,choices=[(tz,tz) for tz in ['UTC'] + pytz.country_timezones('US')],default="UTC")提取时区,基本上可以告诉我所选择的时区。

在我需要将采用的时间呈现给用户时区之前,一切都很好。

因此,在我的情况下,用户具有“太平洋/檀香山”时区。对象时间字段已保存到“美国/纽约”时区,无论选择哪个时区,我都将获得相同的时间。

我在做什么错了?

(我为此放弃了官方文档)

这是我的模板:

{% load tz %}
{% get_current_timezone as TIME_ZONE %}

{% for object in objects %}
    {% localtime on %}
        {{ object.min_reservation_time }}
    {% endlocaltime %}
{% endear %}

此外-当我尝试在此精确模板中渲染{{TIME_ZONE}}时-我什么也没得到。

这是我的settings.py:

TIME_ZONE = 'UTC' # Default timezone if custom timezone is not activated by middleware

USE_I18N = True

USE_L10N = True

USE_TZ = True

因此,用户再选择一次时区,如果用户登录,则由中间件对其进行处理,并且...由于某种原因没有任何变化。

解决方法

您会做正确的事- 如果您有DateTimeField。但是,作为文档says

Django仅支持朴素的时间对象,并且如果您尝试保存有意识的时间对象,则会引发异常,因为没有关联日期的时间的时区没有意义。

因此Django的时区支持都不适用于TimeField。如果您确实要使用TimeField,并根据用户的时区调整值,则必须手动进行操作。