【问题标题】:How to show local time in template如何在模板中显示当地时间
【发布时间】:2018-01-22 14:13:44
【问题描述】:

我正在使用 PostgreSQL 来存储一个带有 DateTimeField 的对象。
DateTimeField 正在使用 auto_now_add 选项。
它是从Django Rest Framework 中的序列化程序自动创建的。

Django docs 中所述,我尝试获取本地时区并激活它。

from django.utils.timezone import localtime, get_current_timezone

tz = get_current_timezone()
timezone.activate(tz)
session.started_at = localtime(session.started_at)

在模板index.html中,我也尝试加载时区。

{% localtime on %}
   Session: start time {{ item.session.started_at }} 
{% endlocaltime %}

settings.py

USE_TZ = True
TIME_ZONE = 'UTC'

我使用的是 GMT+7 时区,但它仍然在模板上显示 UTC 时间。

我正在使用 Django 开发服务器进行测试。

我错过了什么吗?

【问题讨论】:

  • 为什么不呢?您将时区设置为UTC?您的客户端(浏览器)在 GMT+7 中,但 Django 不知道。
  • here 所述,它是默认时区。有current time zone用于渲染。

标签: python django postgresql


【解决方案1】:

假设您的所有日期时间都以 UTC 格式正确存储在数据库中,您可以在模板中使用 tz django 实用程序将日期转换为本地时间

IE 如果日期时间存储为 2017 年 10 月 12 日 18:00:00,我想将其转换为 America/La_Paz 本地时间 (GMT -4) 我可以使用

Session: start time {{ item.session.started_at|timezone:"America/La_Paz" }}

并且在模板中将显示当地时间到 America/La_Paz(在这种情况下为 2017 年 10 月 12 日 14:00:00)

模板/my_template.html

{% load tz %}
<!-- some html code here -->
Session: start time {{ item.session.started_at|timezone:"America/La_Paz" }}

您可以在视图中创建一个 cotext var 或一个 var 来设置您用来在 tmeplate 中投射日期的时区,并使用它来进行投射

在你看来:my_timezone = 'A VALID TIMEZONE NAME'

在你的模板中再次出现

模板/my_template.html

{% load tz %}
<!-- some html code here -->
Session: start time {{ item.session.started_at|timezone:my_timezone}}

【讨论】:

    【解决方案2】:

    找到用户的时区后,在 Django 2 及更高版本中执行此操作:

    {% load tz %}
    {% timezone "Europe/Paris" %}
        Paris time: {{ object.date }}
    {% endtimezone %}
    

    【讨论】:

      【解决方案3】:

      如果我没记错 TIME_ZONE 设置设置“本地”时区,那么将其从 UTC 更改为您的本地时区。

      没有向服务器显示客户端时区的 HTTP 标头。大多数使用本地化时间的网站都会询问用户他们所在的时区并将其保存在用户个人资料中。请参阅 Django 文档 https://docs.djangoproject.com/en/2.0/topics/i18n/timezones/#selecting-the-current-time-zone

      Javascript 有一种访问 UTC 偏移量的方法,也许您可​​以使用它将信息与请求一起发送到您的服务器。

      【讨论】:

      【解决方案4】:

      您的 webapp 的用户可能处于不同的时区,因此需要转换到适当的时区。您可以创建一个中间件并使用activate 函数来设置当前时区。要获得适当的时区,您可以在登录页面中对 Free IP Geolocation API 进行 ajax api 调用,时区值可以保存在 cookie 变量中,以后可以在中间件中访问。

      landingpage.html

      <script>
      $.ajax({
              url: 'https://freegeoip.app/json/',
              dataType: 'json',
              success: function (data) {
                  document.cookie = 'timezone=' + data['time_zone'] + '; path=/';
              }
            });
      </script>
      

      middleware.py

      import pytz
      import requests
      
      from django.utils import timezone
      
      class TimezoneMiddleware:
          def __init__(self, get_response):
              self.get_response = get_response
      
      def __call__(self, request):
          
          tzname = request.COOKIES.get('timezone')
          if tzname:
              timezone.activate(pytz.timezone(tzname))
          else:
              timezone.deactivate()
          return self.get_response(request)
      

      settings.py

      MIDDLEWARE = [      ........
                  'projectname.middleware.TimezoneMiddleware',
      

      ]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        • 1970-01-01
        • 2014-06-08
        相关资源
        最近更新 更多