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

问题描述 投票:0回答:3

这可能是一个小问题,但是我不能让 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>
django
3个回答
13
投票

Django 的 源代码(如所选答案中所示)解释了

timezone.now()
的概念:

  1. datetime.now()
    产生当前时间(在您的活动时区中!),没有时区信息(“天真的日期时间”),而...
  2. timezone.now()
    always 产生 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())
可能是最直观的。仍保留时区信息的当地时间。

编辑: 时区感知本地时间的标准库等效项是

datetime.now().astimezone()
astimezone 默认应用系统本地时区,这允许您将任何时区感知的日期时间正确转换为本地时间。要使用时区名称设置任意时区,您需要 pytz 包。

from datetime import datetime, timezone
import pytz

datetime.now()
# datetime.datetime(2022, 9, 14, 5, 26, 35, 146551)
datetime.now().astimezone()
# datetime.datetime(2022, 9, 14, 5, 26, 44, 19645, tzinfo=datetime.timezone(datetime.timedelta(seconds=7200), 'CEST'))
datetime.now(tz=timezone.utc)
# datetime.datetime(2022, 9, 14, 3, 26, 51, 203917, tzinfo=datetime.timezone.utc)
datetime.now(tz=timezone.utc).astimezone()
# datetime.datetime(2022, 9, 14, 5, 26, 58, 546724, tzinfo=datetime.timezone(datetime.timedelta(seconds=7200), 'CEST'))
datetime.now(tz=pytz.timezone('Europe/Kiev'))
# datetime.datetime(2022, 9, 14, 6, 27, 38, 714633, tzinfo=<DstTzInfo 'Europe/Kiev' EEST+3:00:00 DST>)

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

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


0
投票

这取决于

现在() 当 USE_TZ 分别为 True 或 False 时,返回表示当前时间点的感知或天真的日期时间。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.