【问题标题】:How to get the current user time zone? Django如何获取当前用户时区?姜戈
【发布时间】:2020-12-07 11:23:12
【问题描述】:

我正在尝试让我的 Django 应用程序在当前用户时区工作,但我没有得到任何结果...

在我的 settings.py 文件中,我设置了: TIME_ZONE = 'UTC'

在我的views.py我设置在代码的顶部:

activate(settings.TIME_ZONE)

但这不起作用,在创建帖子时,正在获取我的最后一个时区“马德里”,而不是我当前的时区。

有没有办法让它工作?

谢谢!

【问题讨论】:

  • 您能添加一些信息和代码吗?您是否在模型中使用 from django.utils import timezonetimezone.now()models.DateTimeField(auto_now_add=True) 之类的东西?
  • 根据您所说的,您有 1 个时区,UTC。因此 django 将使用它作为默认时区,然后您在视图中激活了该(相同)时区。所以这显然不会做任何不同的事情。本地化 django 可能相当复杂,但从时区文档开始; docs.djangoproject.com/en/3.1/topics/i18n/timezones

标签: python django


【解决方案1】:

这是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 上下文变量。

【讨论】:

    【解决方案2】:

    来自https://docs.djangoproject.com/en/3.1/topics/i18n/timezones/

    from django.utils import timezone
    
    now = timezone.now()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 2020-10-18
      • 2020-08-17
      • 2012-01-01
      • 2014-09-12
      • 1970-01-01
      相关资源
      最近更新 更多