2013-03-03 63 views
0

我真的很難把握這與時區。我有一個日曆應用程序,像這樣一個模型:不能讓時區datetime對象打印正確的時間

class Events(models.Model): 
    dtstart = models.DateTimeField('Start') 
    ... 

    def __unicode__(self): 
     aware = self.dtstart.replace(tzinfo=timezone.get_current_timezone()) 
     #dt = defaultfilters.date(aware, 'Y-m-d H') 
     dt = aware.strftime('%Y-%m-%d %H:%M') 
     return dt 

和settings.py包含此:

TIME_ZONE = 'Europe/Stockholm' 
USE_TZ = True 

如果我使用Django管理界面添加的事件開始約19:00明天,sqlite數據庫將包含此:

$ sqlite3 ~/django_test.db "SELECT dtstart from events_events" 
2013-03-04 18:00:00 

這似乎是一個utc時間戳給我(我懷疑這是正確的)。當我使用{{event.dtstart|date:"H.i"}}呈現html時,這一切都很好。它應該顯示19:00。但問題在於Event類的__unicode__ - 方法返回2013-03-04 18:00。我有,正如你所見,試圖解決這個問題,但我卡住了。我的問題在哪裏?如何使此__unicode__方法返回2013-03-04 19:00。我認爲現在是瑞典的夏令時。

回答

1

不要使用.replace(tzinfo=tz)設置時區,使用tz.localize()代替:

aware = timezone.get_current_timezone().localize(self.dtstart) 

pytz documentation

第一種方法是使用由pytz庫提供的局部化()方法。這是用來定位一個天真的日期時間(日期時間,沒有時區信息):

>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0)) 
>>> print(loc_dt.strftime(fmt)) 
2002-10-27 06:00:00 EST-0500 

但是,如果你的日期時間爲UTC時間,你應該使用UTC時區,而不是,然後表達的時間在不同的時區用於顯示:

from pytz import UTC 

aware = UTC.localize(timezone.get_current_timezone()) 
dt = aware.astimezone(timezone.get_current_timezone()).strftime('%Y-%m-%d %H:%M')