被django时区支持困惑

时间:2015-10-16 09:59:49

标签: python django datetime

Django初学者。

在官方文件中:

# Support for time zones is enabled in the default settings file, so
# Django expects a datetime with tzinfo for pub_date. Use timezone.now()
# instead of datetime.datetime.now() and it will do the right thing.
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())

尝试在./manage.py shell中重现它:

In [35]: from django.conf import settings

In [36]: settings.USE_TZ
Out[36]: True

In [37]: settings.TIME_ZONE
Out[37]: 'Europe/Moscow'

In [38]: from django.utils import timezone

    # UTC
In [39]: timezone.now()
Out[39]: datetime.datetime(2015, 10, 16, 9, 47, 50, 755418, tzinfo=<UTC>)

    # Actual time
In [40]: timezone.datetime.now()
Out[40]: datetime.datetime(2015, 10, 16, 12, 47, 54, 554197)

    # UTC
In [41]: timezone.activate("Europe/Moscow"); timezone.now()
Out[41]: datetime.datetime(2015, 10, 16, 9, 47, 59, 405269, tzinfo=<UTC>)

    # Actual time
In [42]: timezone.activate("Europe/Moscow"); timezone.datetime.now()
Out[42]: datetime.datetime(2015, 10, 16, 12, 48, 3, 179085)

当我按照文档中的规定运行timezone.now()时,我发现UTC是错误的。当我正在运行timezone.datetime.now()时(我认为只是呼叫datetime.datetime.now(),这是使用系统范围的时区)我正在做正确的事情。

尝试使用不同的时区,仍然获得纯UTC。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

timezone.now()的行为应符合:USE_TZ=True;它将当前时间作为有意识的日期时间对象返回(以UTC为单位)。

2015-10-16 09:47:50+00:00 (UTC)2015-10-16 12:47:50+03:00 (MSK)的时间相同。 UTC时间使用您当前的时区在模板中呈现(默认为TIME_ZONE设置,因此无需在此处使用timezone.activate()明确设置它。)

您可以使用timezone.localtime(timezone.now())(您不需要)明确获取该值。