【问题标题】:Django Time Zone issueDjango时区问题
【发布时间】:2021-01-26 18:00:56
【问题描述】:

我的 Django 应用程序中的 TimeZones 有很多问题。

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

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

我有一个中间件类,它为经过身份验证的用户激活时区:

#'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

所以再一次,用户选择时区,如果用户登录,中间件会处理它,并且......由于某种原因没有任何变化。

【问题讨论】:

    标签: python django timezone pytz django-timezone


    【解决方案1】:

    你会做正确的事——如果你有一个DateTimeField。但是,作为文档says

    Django 仅支持原始时间对象,如果您尝试保存可感知时间对象,则会引发异常,因为没有关联日期的时间的时区没有意义。

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

    【讨论】:

    • 谢谢!我害怕这个-.-
    • @dev.ink:我的第一个建议是仔细考虑这个结论,它代表了专家的共识:“没有相关日期的时间的时区没有意义”。让我们以檀香山和纽约为例。一个使用 DST,另一个不使用,因此它们之间的偏移量会根据日期而变化。因此,在不知道您正在谈论的一年中的哪一天的情况下尝试调整它们之间的时间是没有意义的。通过重新考虑架构以解决这一问题,并使用DateTimeFields,您将使您的生活更轻松。
    • 在我的情况下,我有一个具有开放时间和关闭时间的对象,我无法设置或定义开放时间的 DATE,因为如果您知道我的意思,日期每天都会不同。我可以做的是每次在页面加载之前保存今天的日期,并更改年、月和日的 db 值,并保持时间。但我认为这不是一个好习惯。
    • 但是开放和关闭时间应该受到时区的影响,因此用户可以根据他们的区域看到它们。
    • @dev.ink:所以你想花点时间,在特定的那一天把它显示给用户,就好像它在他们的时区一样?当然,您可以通过在您的视图中将时间和今天的日期组合成一个有意识的日期时间来轻松地做到这一点。但是,另一个问题是您这样说:“对象时间字段已保存到 'American/New_York' 时区”。这些是幼稚的时间,因此它们不会与附加的任何时区信息一起保存。无法知道他们保存在哪个时区。
    猜你喜欢
    • 2011-06-15
    • 2015-02-11
    • 2013-11-23
    • 2016-09-20
    • 2012-06-06
    • 2015-01-06
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多