簡體   English   中英

模板Django中日期時間時區感知對象的錯誤轉換

[英]Wrong conversion of datetime timezone aware object in template Django

我有 2 個日期時間對象,時區為Europe/BerlinUS/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>)

這些時間應分別顯示為 10:20AM 和 12:16PM。

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

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

我肯定做錯了什么,有什么想法嗎?

這對我來說也是新事物,因為我剛剛發現了這一點。 因此,我將此添加為答案。

來自 Django 文檔:

當您啟用時區支持時,Django 會將感知的日期時間對象在模板中呈現時轉換為當前時區


什么是當前時區?

再次,來自文檔:

默認時區是由TIME_ZONE設置定義的時區。

當前時區是用於渲染的時區。

您應該使用activate()當前時區設置為最終用戶的實際時區。 否則,將使用默認時區。


解決方案:

渲染前只需在視圖中調用timezone.activate方法,Django 將在您設置的任何時區渲染時間。

import pytz
from django.utils import timezone

def my_view(...):

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

    render(...)

要在單個渲染中顯示多個時區:

您可以使用timezone過濾器timezone標簽來覆蓋模板特定部分中的時區:

{% load tz %}

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM