2015-03-13 19 views
0

在我的Django應用我正在面對兩個日期時間對象(self.dueDate爲Date對象):與同一時區,但不同UTCOFFSET()DateTime對象

ref_time = timezone.localtime(timezone.now(), timezone.get_default_timezone()) 
threshold = datetime.combine(self.dueDate, 
           time(tzinfo=timezone.get_default_timezone())) 
      - timedelta(days = 1) 

我構建他們具有相同的時區(他們有),但他們最終有兩個不同的UTC時差。

>>>print threshold, threshold.tzinfo 
2015-03-13 12:08:00+00:50 Europe/Rome 
>>>print ref_time, ref_time.tzinfo 
2015-03-13 12:48:29.372984+01:00 Europe/Rome 

這是怎麼發生的?同一個tz有兩個不同的偏移量怎麼可能? (以及爲什麼會有50分鐘?)

+0

無關:請確保您知道[默認時區和當前時區]之間的區別(https://docs.djangoproject.com/zh/1.8/topics/i18n/timezones/#default-current-time-zone ) – jfs 2015-03-13 20:39:12

回答

0

在不同時間可能有不同的utc偏移量。 time(tzinfo=tz)使用默認的utc偏移量,例如,最有可能的最早日期是而不是您想要的。請參閱:

爲了得到當前時間tz時區作爲意識到DateTime對象:

from datetime import datetime 

ref_time = datetime.now(tz) 

爲了得到一個半夜天作爲awa的self.dueDate之前再DateTime對象:

from datetime import time as datetime_time, timedelta 
from django.utils import timezone 

midnight_yesterday = datetime.combine(self.dueDate, datetime_time()) - timedelta(1) 
threshold = timezone.make_aware(midnight_yesterday) 

注:threshold可能會更加/不到24小時前,看到How can I subtract a day from a python date?

+0

非常感謝,使用timezone.make_aware()而不是設置tzinfo做到了。你救了我的一天! – pnjun 2015-03-14 15:04:14

+0

@pnjun:如果您執行可能穿越DST邊界的日期時間算法,請小心。 'make_aware()'不會修復它,例如,如果你想要24小時前,那麼你需要一個不同的代碼。查看答案中的最後一個鏈接。 – jfs 2015-03-14 15:10:42

相關問題