2013-10-02 77 views
4

settings.py我:Django的似乎顯示在UTC格式的日期時間

TIME_ZONE = 'Asia/Singapore' 
USE_I18N = True 
USE_L10N = True 
USE_TZ = True 

如果用戶(誰是居住在新加坡)在我的網站上,存儲在我的(PostgreSQL的價值形式進入2013-10-07 01:00 A.M. )數據庫是2013-10-07 01:00:00+08。當我在python manage.py shell會議期間提取這些信息時,我得到了2013-10-06 17:00:00+00:00。當我嘗試在模板中呈現此信息時會發生同樣的情況。

我認爲正在發生的事情:Django認識到用戶正在輸入凌晨1點A.M.新加坡時間10月10日,並將其作爲2013-10-07 01:00:00+08存儲在數據庫中。但是,當Django從數據庫中檢索此信息時,它會將其格式設置爲UTC時間,從而給出2013-10-06 17:00:00+00:00

我有這個權利嗎?如果是這樣,我能做些什麼來使用存儲在數據庫中的相同時區信息(或至少使用我的TIME_ZONE設置)來製作Django顯示時間?換句話說,我怎樣才能讓用戶看到日期時間與她輸入的日期時間完全相同?

回答

2

有你看了localtime模板標籤

更新: 然而,它是指設置USE_TZTrue你有

+0

感謝您的迴應;我想我明白了。看到我對自己問題的回答。 – GChorn

10

我已經想通了這是怎麼回事。根據我的文檔here讀過,我是假設與USE_TZ=True,Django的將在當前時區輸出日期時間(默認爲TIME_ZONE設置)到處 --views,外殼等

但是,事實證明,Django 只有在模板中進行了轉換,並且即使這樣也只在最直接的,基本調用了一個datetime對象。

特別是,如果你有一個objectDateTimeField和渲染其datetime屬性使用{{ object.datetime }}模板,你會得到轉換爲當前時區的日期時間。好極了。但是,即使在模板中,例如{{ object.datetime.hour }}(將以UTC顯示小時),此功能也不適用於其他任何。所以它基本上只是一個不可見的模板標籤。不像我希望的那樣神奇!

看起來我需要將所有日期時間轉換爲我的視圖中的當前時區,然後再將它們傳遞給我的模板。考慮到我的數據庫已經有所有的日期時間存儲在我希望它們顯示在其中的時區中,我覺得這種奇怪和違反直覺是不是明智地告訴Django你希望數據庫值表達在UTC,而不是讓Django自動執行這項工作,然後讓你在視圖中改回它們?

編輯:answer上如此作出的解決方案,我相當具體情況簡單:

from django.utils.timezone import localtime 

result = localtime(some_time_object) 

編輯:事實證明,只有PostgreSQL的存儲時區信息,而這些信息是分開它存儲的原始日期時間值,以UTC表示。所以我猜想Django默認情況下以UTC格式呈現所有內容是有意義的,因爲其他數據庫後端甚至不存儲時區信息。

+0

另一件需要記住的事情是:如果生成一個具有tzinfo對象的感知日期時間,然後將其保存到Postgres中,然後檢索它,新的日期時間將是UTC準確的,但不會有原始的tzinfo。這意味着如果將預保存和保存的日期時間與==進行比較,它將返回True,但由於時區不同,它們不是完全相同的對象。 – vaughnkoch

+0

Mysql還允許在字段中存儲與時區相關的信息。 – IJR