2012-05-28 34 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