Python 模板Django中datetime时区感知对象的错误转换
我有两个datetime对象,其时区分别为Python 模板Django中datetime时区感知对象的错误转换,python,django,datetime,Python,Django,Datetime,我有两个datetime对象,其时区分别为Europe/Berlin和US/Eastern,我最初设置为pytz 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 D
Europe/Berlin
和US/Eastern
,我最初设置为pytz
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>)
我肯定是做错了什么,有什么想法吗?这对我来说也是一件新鲜事,因为我刚刚发现了这一点。因此,我添加这个作为一个答案 来自Django文档: 启用时区支持时,Django会在模板中呈现aware datetime对象时将其转换为当前时区
什么是当前时区? 同样,从文档: 默认时区是由
时区
设置定义的时区
当前时区是用于渲染的时区
您应该使用activate()
将当前时区设置为最终用户的实际时区。否则,将使用默认时区
解决方案: 只需调用
时区。在渲染之前激活视图中的
方法,Django将在您设置的任何时区中渲染时间
import pytz
from django.utils import timezone
def my_view(...):
tzname = pytz.timezone("Europe/Berlin")
timezone.activate(pytz.timezone(tzname))
render(...)
要在单个渲染中显示多个时区,请执行以下操作:
您可以使用或覆盖模板特定部分中的时区:
{% load tz %}
<!-- Using the filter -->
{{ value|timezone:"Europe/Paris" }}
<!-- Using the tag -->
{% timezone "Europe/Berlin" %}
Berlin time: {{ value }}
{% endtimezone %}
{%load tz%}
{{value}时区:“欧洲/巴黎”}
{%时区“欧洲/柏林”%}
柏林时间:{{value}}
{%endtimezone%}
如果用python打印值(在将值传递到模板之前),您得到了什么值?如果我在将datetime对象传递到模板之前打印它,它将返回2019-06-11 10:20:00+02:00
“欧洲/柏林”datetime对象,因此如果我理解正确,您希望在时间UTC+1
上显示这些对象?我希望使用datetime对象中反映的正确时间来显示它们。看看我的第一个对象datetime.datetime(2019、6、11、10、20…
应显示上午10:20,但它是not@Cyzanfar:您是否在设置.py中将使用设置设置为True
?如果我想在一个模板中显示两个不同的时区,该怎么办?再次参考航班搜索示例OK cool。我很好奇他们为什么要设计这个是的。应该有一个合理的理由,但我现在没有看到。@Cyzanfar有一个时区
和,你可以用它覆盖模板特定部分的时区。是的,我看到了。我试图避免这样做,但我想这是我现在唯一的选择。谢谢你的回答:)
{% load tz %}
<!-- Using the filter -->
{{ value|timezone:"Europe/Paris" }}
<!-- Using the tag -->
{% timezone "Europe/Berlin" %}
Berlin time: {{ value }}
{% endtimezone %}