2009-10-15 32 views
4

文檔說:是否配置django的setting.TIME_ZONE會影響datetime.datetime.now()?

http://docs.djangoproject.com/en/dev/ref/settings/#time-zone

請注意,這是時區 着Django所有 日期/時間轉換 - 不一定是 時區的服務器。例如,一個服務器可以服務多個 Django支持的站點,每個站點都有一個獨立的時區設置,每個站點都有一個 。 通常,Django將 os.environ ['TZ']變量設置爲您在TIME_ZONE 設置中指定的時間段 區域。因此,所有您的意見和 型號將自動運行在 正確的時區。

我已經讀了好幾遍了,但我不清楚TIME_ZONE設置是怎麼回事。

如果我希望帶有日期時間標記的模型顯示給用戶本地時區,我應該管理UTC偏移嗎?

例如在節省使用,datetime.datetime.utcnow()而不是datetime.datetime.now(),並在視圖中做這樣的事情:

display_datetime = model.date_time + datetime.timedelta(USER_UTC_OFFSET) 

回答

4

出乎我的意料,它似乎至。

web81:~/webapps/dominicrodger2/dominicrodger$ python2.5 manage.py shell 
Python 2.5.4 (r254:67916, Aug 5 2009, 12:42:40) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 
>>> import settings 
>>> settings.TIME_ZONE 
'Europe/London' 
>>> from datetime import datetime 
>>> datetime.now() 
datetime.datetime(2009, 10, 15, 6, 29, 58, 85662) 
>>> exit() 
web81:~/webapps/dominicrodger2/dominicrodger$ date 
Thu Oct 15 00:31:10 CDT 2009 

而且讓我的對象創建自動添加時間戳(使用auto_now_add,我相信是的,我沒有得到分心而寫這個答案:-)

我使用TIME_ZONE設置爲即將不贊成)在我設定的時區顯示創建時間。

如果您想將這些時間轉換爲您網站訪問者的時區,則需要按照您提供的示例做更多的工作。如果您想進行大量時區轉換以在您的網站訪問者時區中顯示時間,那麼我強烈建議您將您的TIME_ZONE設置設置爲以UTC存儲時間,因爲這會使您的生活從長遠來看更加輕鬆(您可以使用UTC偏移量,而不必擔心夏令時)。

如果您有興趣,我相信時區設置從TIME_ZONE設置here

編輯,每次您的評論,它不工作在Windows上,這是因爲在Django的來源如下:

if hasattr(time, 'tzset'): 
    # Move the time zone info into os.environ. See ticket #2315 for why 
    # we don't do this unconditionally (breaks Windows). 
    os.environ['TZ'] = self.TIME_ZONE 
    time.tzset() 

的Windows:

C:\Documents and Settings\drodger>python 
ActivePython 2.6.1.1 (ActiveState Software Inc.) based on 
Python 2.6.1 (r261:67515, Dec 5 2008, 13:58:38) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import time 
>>> hasattr(time, 'tzset') 
False 

的Linux:

web81:~$ python2.5 
Python 2.5.4 (r254:67916, Aug 5 2009, 12:42:40) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import time 
>>> hasattr(time, 'tzset') 
True 
+0

我只是試圖在這裏使用manage shell重複你的測試,它似乎沒有......奇怪。 >>> datetime.datetime.now()datetime.datetime(2009,10,15,15,37,47,869000)>>>導入設置>>> settings.TIME_ZONE'Europe/Zurich'>>> datetime.datetime .now()datetime.datetime(2009,10,15,15,37,59,838000)>>> exit()PS D:\> date Thu Oct 15 15:38:25 TST 2009 – monkut 2009-10-15 06:41:07

+0

無論如何,正如您所提到的這聽起來像是一個好主意,只是使用UTC時間。 – monkut 2009-10-15 06:43:28

+0

我不知道這是因爲我發佈的來源106-107行的評論。嘗試運行'hasattr(time,'tzset')'。 – 2009-10-15 09:23:30

1

TIME_ZONE作爲UTC,utcnow()和now()是相同的。這可能是你想要的。那麼你可以記錄現在的時間/ utcnow和功能,如timesince將完美地爲每個用戶。要向特定用戶顯示絕對時間,可以按照您的建議使用utc偏移量。

相關問題