2012-11-13 26 views
1

我正在使用Django。Python Django:tzinfo不適用於數據庫插入。但爲什麼.now(local_tz)有效?

在設置:

TIME_ZONE = 'Europe/Copenhagen' 
USE_TZ = True 

由於DST,時鐘會在2013年3月31日一個小時。 01:59前往03:00

我的觀點:

的日期和時間在本地時間中給出。我希望這些插入爲utc。

下面的代碼正確保存爲UTC,但給人RuntimeWarning:DateTimeField字段收到一個天真的日期時間

the_date = datetime.datetime(2013, 3, 31, 1, 59) 
hit = hits(date= the_date); hit.save(); # Correctly saved as 00:59:00 

the_date = datetime.datetime(2013, 3, 31, 3, 1) 
hit = hits(date= the_date); hit.save(); # Correctly saved as 01:01:00 

我想我可以通過將日期時間知曉避免該警告。它確實避免了警告,但轉換現在是錯誤的。

tz = timezone(settings.TIME_ZONE) 
the_date = datetime.datetime(2013, 3, 31, 3, 1, tzinfo = tz) 
hit = hits(date= the_date); hit.save(); # Incorrectly saved as 02:01:00 

下工作,沒有運行時錯誤:

I have installed pytz. 
the_date = local_tz.localize(datetime.datetime(2013, 3, 31, 3, 1)) 

前往我的問題:

我得到tzinfo不起作用,因爲它不考慮夏令時。好吧,我不會用它。但後來我很困惑,當以下似乎工作:

the_date = datetime.datetime.now(local_tz) 

這正確插入爲UTC無論是在冬季(其中減去了1小時,以獲得UTC),當我改變了我的電腦SYSTIME一個日期在夏季(它減去2小時得到utc)。

我的問題:

請問。現在(local_tz)工作還是我測試它錯了嗎?爲什麼這與tzinfo = tz不同?或者我使用tzinfo錯誤?

回答

0

我建議儘快轉換爲UTC,並且只在內部使用UTC。除了跨越時區(例如海上船隻)移動並確實需要保存時區信息的情況外,對於恆定時區情況,只需使用本地時間輸入/輸出並在用戶界面將其轉換爲UTC就簡單多了。

要從本地時間轉換爲UTC,您需要使用pytz.timezone.normalize方法來處理夏令時和其他時區轉換。請參閱section of the pytz documentation。在你的情況下,要將本地日期時間轉換爲UTC,您需要以下內容:

from pytz import timezone, utc 

local_tz = timezone(settings.TIME_ZONE) 
local_dt = datetime.datetime(2013, 3, 31, 3, 1, tzinfo = local_tz) 
utc_dt = utc.normalize(local_dt.astimezone(utc)) 
+0

它也適用於localize(),包括dst。我可以插入罰款(至少我認爲是這樣)。問題是爲什麼datetime.now(local_tz)在設置tzinfo時不工作?我可以像那樣使用datetime.now(local_tz)。 (我很好奇看到一個正常化的例子,但本地化不是,但這是另一個問題......) – user984003

+0

似乎有些情況下,'normalize'確實是必要的,儘管我不能給你現在就是一個例子。我將留下供參考的答案。無論如何,如果你的時區是恆定的,我真的建議總是在內部使用UTC,並且只能從/到本地時間進行輸入/輸出轉換:它會爲你節省一些麻煩。 –

+0

是的,我同意儘可能使用utc。但我真正想要的是理解這些東西,而不是隻有一種方法可行。這是我不明白的。 (我有時會在當地時間給出日期,我需要處理這些日期。) – user984003

相關問題