【问题标题】:Django: Model data not displaying in local timezoneDjango:模型数据未在本地时区显示
【发布时间】:2018-12-17 20:14:59
【问题描述】:

我正在使用 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

想法? 提前致谢!

【问题讨论】:

  • 本地时间是您在 settings.py 文件中设置的时区显示的时间,默认为 UTC。我从您的问题中了解到,您正在寻找用户时区的时间。

标签: django django-templates utc pytz


【解决方案1】:

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

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

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

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

这里有一个 django 插件 django-easy-timezones 可以帮助你。它基本上使用中间件来获取连接用户的 IP 地址信息,然后使用ip geolocation database 将其与国家/地区映射以获取最终用户的时区。

【讨论】:

  • 这看起来很不错,但我无法通过“GEOIP_DATABASE 设置已定义,但文件不存在”。错误。我尝试将 GEOIP_Database 放在我的 settings.py 文件和 django 项目中的多个位置,但它似乎从未识别过它。
  • @MicahPearce 我自己没有使用它,但在这里分享,因为它看起来很有前途。您可以添加您尝试但没有工作的相关代码吗?我敢肯定一定有一些小故障。
【解决方案2】:

你试过了吗?

TIME_ZONE = 'UTC'

这里是list

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-05
    • 2018-08-29
    • 2017-09-14
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    相关资源
    最近更新 更多