2012-05-28 73 views
27

我有點由夏令混淆處理django的1.4 timezone.now()與datetime.datetime.now()

settings.py:

TIME_ZONE = 'Europe/London' 
USE_TZ = True 
在django的殼

>>> from django.utils import timezone 
>>> import datetime 
>>> print timezone.now() 
2012-05-28 11:19:42.897000+00:00 
>>> print timezone.make_aware(datetime.datetime.now(),timezone.get_default_timez 
one()) 
2012-05-28 12:20:03.224000+01:00 

爲什麼它們在夏令時方面不一樣?兩者都應該是區域意識,不是嗎?

我已閱讀文檔,但沒有更聰明的。

回答

43

根據timezone.now()

def now(): 
    """ 
    Returns an aware or naive datetime.datetime, depending on settings.USE_TZ. 
    """ 
    if settings.USE_TZ: 
     # timeit shows that datetime.now(tz=utc) is 24% slower 
     return datetime.utcnow().replace(tzinfo=utc) 
    else: 
     return datetime.now() 

它是基於utc,而不是默認的時區。你可以通過使用

now = timezone.make_aware(datetime.datetime.now(),timezone.get_default_timezone()) 
print now.astimezone(timezone.utc) 
+15

達到相同的價值,這有點違反直覺。我曾假設timezone.now()會在默認的時區給我。在我看來,這不是pythonic。使用.astimezone()解決了我的問題,謝謝。 – meepmeep

+0

爲什麼我在執行以下操作時不斷收到錯誤:>>> import datetime >>> from django.utils import timezone >>> from polls.models import問題 >>>#用pub_date創建問題實例未來30天 >>> future_question =問題(pub_date = timezone.now()+ datetime.timedelta(天= 30)) >>>#最近發佈了嗎? >>> future_question.was_published_recently() 真 – pitchblack408

+0

>>> future_question.was_published_recently() 回溯(最近通話最後一個): 文件 「」,1號線,在 文件「C:\用戶\ michmar3 \工作區\ pollsite \ polls \ models.py「,第17行,在was_p ublished_recently return self.pub_date> = datetime.datetime.now() - datetime.timedelta(days = 1) 文件」C:\ jython2。 7b2 \ Lib \ datetime.py「,第1727行,在__ge__中 return self .__ cmp(other)> = 0 文件」C:\ jython2.7b2 \ Lib \ datetime.py「,第1765行,在_datetime__cmp中 raise TypeError (「不能比較天真並知道日期時間「) TypeError:無法比較天真和意識日期時間 – pitchblack408