模板Django中对datetime时区感知对象的错误转换

时间:2019-06-09 19:20:14

标签: python django datetime

我有两个日期时间对象,它们最初是用Europe/Berlin设置的,时区为US/Easternpytz

datetime.datetime(2019, 6, 11, 10, 20, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>)

datetime.datetime(2019, 6, 11, 12, 16, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)

这些时间应分别显示为10:20 AM和12:16 PM。

但是,在我的Django模板中,它们是不同的,例如:

{{ value.departure_time.date_time|time:'f A'}} # >> 8:20 AM instead of 10:20AM

我肯定做错了什么,有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这对我来说也是新事物,因为我刚刚发现了这一点。因此,我将其作为答案。

来自Django文档:

  

启用时区支持后,当在模板中呈现日期时,Django会将感知的日期时间对象转换为当前时区


当前时区是什么?

同样,来自文档:

  

默认时区TIME_ZONE设置所定义的时区。

     

当前时区是用于呈现的时区。

     

您应使用activate()当前时区设置为最终用户的实际时区。否则,将使用默认时区。


解决方案:

在渲染之前只需在视图中调用timezone.activate方法,Django就会在您设置的任何时区中渲染时间。

import pytz
from django.utils import timezone

def my_view(...):

    tzname = pytz.timezon("Europe/Berlin")
    timezone.activate(pytz.timezone(tzname))

    render(...)

要在单个渲染中显示多个时区:

您可以使用timezone filtertimezone tag覆盖模板特定部分的时区:

{% load tz %}

<!-- Using the filter -->
{{ value|timezone:"Europe/Paris" }}

<!-- Using the tag -->
{% timezone "Europe/Berlin" %}
    Berlin time: {{ value }}
{% endtimezone %}