7

这可能是一个微不足道的问题,但我不能让 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>
4

3 回答 3

13

Django 的源代码(如所选答案所示)解释了以下概念timezone.now()

  1. datetime.now()产生没有时区信息(“naive datetime”)的当前时间(在您的活动时区!),而...
  2. timezone.now() 始终以 UTC (!)格式生成当前时间以及时区信息。

乍一看,这很烦人,是的。他们本可以决定产生活动时区的当前时间,但他们没有。你仍然可以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())来说可能是最直观的。仍保留时区信息的本地时间。

于 2014-08-19T09:08:18.620 回答
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()

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

于 2012-05-30T16:40:10.007 回答
0

这取决于

now() 当 USE_TZ 分别为 True 或 False 时,返回代表当前时间点的感知或幼稚日期时间。

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

因此,所有人都表明 USE_TZ 在您的情况下是错误的,并且没有考虑到 TZ。

于 2012-05-30T16:39:58.697 回答