输出时区感知django datetime字段,不带过滤器

时间:2014-01-18 02:40:22

标签: django postgresql templates timezone

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

USE_TZ = True

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

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

问题是:我使用datetime构建我的网址,如下所示:

{% 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' %}

如果没有成功,则不会应用日期过滤器标记,并且会出现异常。 我有一个很大的代码库和很多模板,有没有办法解决这个问题而不使用返回datetime timezoned的访问者?

谢谢。

2 个答案:

答案 0 :(得分:1)

实际上Django文档声明:

  

即使您的网站仅在一个时区可用,它仍然是   在数据库中以UTC格式存储数据的良好做法。一个主要原因   是夏令时(DST)。许多国家都有DST系统,   时钟在春天向前移动,在秋天向后移动。如果   你在当地工作,你可能会遇到两次错误   一年,过渡发生的时候。 (pytz文档讨论   更详细的这些问题。)这可能对你没有关系   博客,但如果您对客户进行超额收费或低额收费,则会出现问题   每年一小时,一年两次。解决这个问题的方法是   在代码中使用UTC并仅在与之交互时使用本地时间   最终用户。

此外:

  

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

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

答案 1 :(得分:0)

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

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

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