django now()是不是应该在默认时区?

时间:2012-05-30 16:31:32

标签: django

这可能是一个微不足道的问题,但我不能让django now()处于settings.TIME_ZONE中定义的时区吗?

这就是实际发生的事情:

>>> from django.utils import timezone
>>> timezone.now()
datetime.datetime(2012, 5, 30, 16, 30, 0, 782087, tzinfo=<UTC>)
>>> timezone.get_default_timezone()
<DstTzInfo 'Asia/Singapore' SMT+6:55:00 STD>

3 个答案:

答案 0 :(得分:12)

Django&#39; source code(如所选答案中所示)解释了timezone.now()的概念:

  1. datetime.now()产生当前时间(在您的活动时区!),没有时区信息(&#34;天真的日期时间&#34;),而......
  2. timezone.now() 始终以时区信息生成 UTC当前时间(!)
  3. 乍一看,这是令人恼火的,是的。他们本可以决定产生活跃时区的当前时间,但他们没有。您仍然可以使用timezone.localtime(timezone.now())来获得所需内容:

    from django.utils import timezone
    from datetime import datetime
    
    timezone.get_current_timezone()
    # <DstTzInfo 'Antarctica/McMurdo' LMT+11:39:00 STD>
    datetime.now()
    # datetime.datetime(2014, 8, 19, 20, 8, 8, 440959)
    timezone.localtime(timezone.now())
    # datetime.datetime(2014, 8, 19, 20, 8, 14, 889429, tzinfo=<DstTzInfo 'Antarctica/McMurdo' NZST+12:00:00 STD>)
    timezone.now()
    # datetime.datetime(2014, 8, 19, 8, 8, 22, 273529, tzinfo=<UTC>)
    datetime.utcnow()
    # datetime.datetime(2014, 8, 19, 8, 8, 29, 769312)
    

    对于新手和普通用户timezone.localtime(timezone.now())可能是最直观的。当地时间仍然保留时区信息。

答案 1 :(得分:1)

或者我可以阅读来源:

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()

答案是否定的,我必须自己调整。

答案 2 :(得分:0)

取决于

  

现在()   返回一个有意识或天真的日期时间,表示当USE_TZ分别为True或False时的当前时间点。

https://docs.djangoproject.com/en/dev/ref/utils/#django-utils-timezone

所有这些都表明USE_TZ在你的情况下是假的,而且它没有考虑到TZ。