首页 > 解决方案 > Django:模型数据未在本地时区显示

问题描述

我正在使用 Django 1.11 和 pytz==2018.3。

我有一个聊天模型,其时区字段不会在当地时间显示。

class Message(models.Model):
    sender    = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sender')        
    receiver  = models.ForeignKey(User, on_delete=models.CASCADE, related_name='receiver')        
    message   = models.CharField(max_length=1200)
    timestamp = models.DateTimeField(auto_now_add=True)
    is_read   = models.BooleanField(default=False)

当我像这样正常打印时,我得到:

<div class="textcontainer lighter">
    {{ message }}
    <span class="time-right">{{ message.timestamp|date:"SHORT_DATETIME_FORMAT" }}</span>
</div>

输出:

July 8, 2018, 2:55 a.m

但是,这是 UTC 时间(提前 6 小时。我希望它说一个不同的时间)。

我尝试了以下方法:

{{ message.timestamp|localtime }}

但这无济于事。

我也尝试过包括这两个:

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

在我的 settings.py 文件中,我有:

USE_L10N = True
USE_TZ = True

想法?提前致谢!

标签: djangodjango-templatesutcpytz

解决方案


这里的本地时间是指您在settings.py文件中设置的时区时间,默认为 UTC。像这样的东西在你的定义settings.py

TIME_ZONE = 'America/Chicago'  # or 
TIME_ZONE =  'Asia/Kolkata'

并且以当地时间显示的所有时间现在将仅在该时区中。

我相信您正在寻找的是用户机器的时间,因此 Django 中没有内置任何内容(据我所知)。您需要编写自己的逻辑来获取用户的时区,这可能是基于他们的 IP 地址或在 Javascript 中的客户端处理,这可以让您获得用户机器上的时间。另一种选择是在注册时询问用户的时区并将其保存在数据库中以供以后用于时区转换。

这是一个 django 插件django-easy-timezones可以帮助你。它基本上使用中间件来获取连接用户的 IP 地址信息,然后使用ip 地理定位数据库将其映射到一个国家/地区以获取最终用户的时区。


推荐阅读