【问题标题】:Ouput timezone aware django datetime fields without filters输出不带过滤器的时区感知 django 日期时间字段
【发布时间】:2014-02-07 13:51:48
【问题描述】:

您好,我升级到了 django 1.4,我想利用时区支持,我在 postgres 中保存了一些日期时间字段,一旦我设置了它们,假设我所在城市的时区保存了它们

USE_TZ = True

并将时区设置为我的城市,我的模板中的日期过滤器标签输出正确的小时(时区)

{{ concert.datetime|date:'f' }}

问题是:我使用日期时间来构建我的网址,如下所示:

{% url event artist_slug=concert.slug_name hour=concert.datetime.hour %}

那些没有正确的时区,小时仍然是UTC,这会改变我的链接,我不能做的事情,它会失去所有的页面排名和很多网站链接使用,不可行,不提到网址的时间与广告中的时间不同,这看起来很奇怪。 我试过这个:

{% url event artist_slug=concert.slug_name hour=concert.datetime.hour|date:'H' %}

如果不成功,则不会应用日期过滤器标签并引发异常。 我有一个相当大的代码库和很多模板,有没有办法在不使用返回日期时间时区的访问器的情况下解决这个问题?

谢谢。

【问题讨论】:

  • 我将尝试修补从数据库构建日期时间对象的代码,以使用当前请求 tz 信息对返回的对象进行时区。

标签: django postgresql templates timezone


【解决方案1】:

实际上 Django 文档说明:

即使您的网站仅在一个时区可用,它仍然是 在数据库中以 UTC 格式存储数据的良好做法。一个主要原因 是夏令时 (DST)。许多国家都有夏令时制度, 时钟在春天向前移动,在秋天向后移动。如果 你在当地时间工作,你可能会遇到两次错误 一年,当转变发生时。 (pytz 文档讨论了 这些问题更详细。)这对您来说可能无关紧要 博客,但如果您向客户多付或少付,这将是一个问题 一小时,一年两次,每年。这个问题的解决方案是 在代码中使用 UTC 并仅在与 最终用户。

此外:

启用时区支持后,Django 使用时区感知的日期时间对象。如果您的代码创建了日期时间对象,他们也应该知道。在这种模式下,上面的例子变成:

import datetime
from django.utils.timezone import utc

now = datetime.datetime.utcnow().replace(tzinfo=utc)

模板中的时区感知输出当您启用时区支持时, Django 将感知日期时间对象转换为当前时区 它们在模板中呈现。这非常像格式 本地化。

最后,不用猴子修补任何东西: https://docs.djangoproject.com/en/1.6/topics/i18n/timezones/#template-tags

【讨论】:

  • 实际上我知道所有这些,我已经实现了我所有的内部代码都使用 UTC,我的意思是我希望我的所有 UTC 日期时间自动本地化为当前请求 tz。似乎这样的事情不存在,所以我必须更改所有代码以使用在幕后进行本地化的访问器方法。
  • 你将如何找出当前的请求 TZ(我想你说的是请求用户 TZ)?没有类似的HTTP方法,另外为什么你的项目会依赖于请求的TZ?如果您不与用户 TZ 打交道,那么正如我上面提到的,有 Django 方法可以操作 TZ 而无需猴子修补任何东西。
  • 我是通过用户的各种方法得到的它。
  • 但当前模板在时区上下文中,即当前用户的时区。但是,它只在显示日期时使用,没有任何其他用途(例如 ifchanged 或上述用法)。
【解决方案2】:

不幸的是,我发现使用此方法的唯一方法是将日期转换为用户时区并提供自定义模板标签来获取您想要的部分,例如:

{% url event artist_slug=concert.slug_name hour=concert.datetime|localtime|hour_of_day %}

其中 hour_of_day 是自定义标签 以正确的本地时间返回当前小时。

【讨论】:

    猜你喜欢
    • 2022-08-22
    • 2019-08-31
    • 2018-01-07
    • 1970-01-01
    • 2013-07-02
    • 2015-03-06
    • 2015-12-19
    • 2021-09-24
    • 2017-06-26
    相关资源
    最近更新 更多