2014-01-18 64 views
1

嗨我升級到Django 1.4,我想利用時區支持,我有幾個日期時間字段保存在postgres,他們被保存假設我的城市時區,一次我設置輸出時區知道沒有過濾器的django日期時間字段

USE_TZ = True 

而時區設置爲我的城市日期過濾器標籤我的模板輸出正確的時間(timezoned)

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

的問題是:我使用的日期時間來建立我的網址,像這樣:

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

而那些不正確的時區,小時仍然在UTC,並改變我的鏈接,我不能做的事情,它會失去所有的網頁排名和大量的網站鏈接使用,是不可行的,更不用說它看起來不可思議了,這個url的廣告時間與廣告的時間不同。 我嘗試這樣做:

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

沒有成功,日期過濾器標籤不應用和異常惜售。 我有一個相當大的代碼庫和大量的模板,有沒有辦法解決這個問題,而不使用返回datetime timezoned的accesor?

謝謝。

+0

我打算嘗試將從數據庫構建日期時間對象的代碼修補爲使用當前請求tz info將時間區域重新轉換爲對象。 –

回答

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的時候 他們呈現意識到datetime對象轉換爲當前時區在模板中。這表現得非常像格式 本地化。

最後,沒有猴子補丁什麼: https://docs.djangoproject.com/en/1.6/topics/i18n/timezones/#template-tags

+0

其實我知道所有這些,我有它實現我得到了所有我的內部代碼使用UTC,我的意思是我希望我所有的UTC日期時間自動本地化到當前請求tz。看起來這樣的事情不存在,所以我必須改變我的所有代碼,以使用訪問器方法,在本地後臺進行本地化。 –

+0

如何找出當前的請求TZ(我想你是在談論請求用戶TZ)?沒有類似的HTTP方法,另外爲什麼你的項目依賴於請求的TZ? 如果你沒有處理用戶TZ,那麼正如我上面提到的那樣,有Django的方式來操作TZ而不需要猴子補丁。 – petkostas

+0

我通過用戶的各種方法得到它是的,我的應用程序是時間敏感的,我不想操縱TZ,我希望在該請求的上下文中的所有日期時間被本地化。 –

0

不幸的是,我發現這個工作的唯一方法是將日期轉換到用戶的時區,並提供一個自定義模板標籤,以獲得一塊你想,是這樣的:

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

凡HOUR_OF_DAY是一個自定義標籤 返回當前時間以正確的本地時間。

相關問題