2013-07-03 58 views
4

我有一個模式叫Vote與現場date的Python/Django的MySQL的日期時間處理和時區

date = models.DateTimeField(auto_now_add=True) 

當我添加的元素,在MySQL的日期是UTC日期,但我住在UTC +2時區

我認爲我正確地設置時區在settings.py

TIME_ZONE = 'Europe/Paris' 

Python中使用正確的時區:

>>> print datetime.datetime.now() 
2013-07-03 09:05:04.474000 

MySQL的太多:

> SELECT NOW() 
2013-07-03 09:00:48 

我可以manualy設置日期屬性,它的工作原理,但我想知道爲什麼auto_now_add返回一個錯誤的日期,雖然蟒蛇和MySQL使用正確的時區

謝謝

回答

9

這是一個複雜的約束解釋。從Django 1.4

當USE_TZ爲False,是Django存儲 所有日期時間的時區。當USE_TZ爲True時,這個是 Django將用於在模板中顯示日期時間的默認時區,以及解釋在表單中輸入日期時間的 。

這個是指TIME_ZONE。那你的USE_TZ是什麼?如果您的USE_TZ爲True,則Django將以UTC存儲日期時間,並使用TIME_ZONE以模板和解釋形式顯示。

這是因爲,如果您稍後在另一領域託管您的網站時更改您的TIME_ZONE,則可以很容易地將UTC的任何日期時間轉換爲給定的任何時區。

Django 1.3和更早版本,

注意是時區到Django將所有 日期/時間轉換 - 不一定是服務器的時區。例如, 一臺服務器可能會提供多個Django支持的站點,每個站點都有一個獨立的時區設置 。

通常,Django將os.environ ['TZ']變量設置爲您在TIME_ZONE設置中指定的時區 。因此,您所有的視圖和型號 將自動在正確的時區運行。

但是不告訴你datetime會在什麼時區存儲在數據庫中。無論如何需要進行實驗(我的猜測是UTC)。

print datetime.datetime.now()根據服務器機器的時區設置打印數據時間,除非您通過manage.py shell打開了python控制檯。

同樣適用於MySQL控制檯。它顯示機器時區的日期時間,而不是數據庫中存儲的數據。

+0

我的USE_TZ被設置爲True,我更喜歡將日期存儲在本地時區,所以我將USE_TZ設置爲False並且它工作正常!謝謝 –

+1

請記住,如果將它設置爲「False」,那麼在本地化您的應用程序時,您將面臨巨大的痛苦。我更願意以UTC存儲它,並編寫一箇中間件來爲當前請求設置timzone。如果你有時間,花點時間研究這個http://stackoverflow.com/questions/15065338/django-timezone-localization-not-working-as-expected :) – Babu

+0

好吧,我的應用程序不應該本地化。但我爲下一個開發人員記住這一點。感謝非常有用的評論 –