Django-TIME_ZONE和timezone.now()

时间:2019-07-13 12:11:36

标签: python django django-timezone

我有以下设置:-

TIME_ZONE = 'Asia/Kolkata'  
USE_I18N = True
USE_L10N = True
USE_TZ = True

此外,我在auto_now = True中设置了DateTimeField。但是,保存在UTC列中的日期时间(即-5:30小时)。

我已经按照Asia/Kolkata时区设置了系统日期。还有,

>>> from django.utils import timezone
>>> from datetime import datetime
>>>
>>> datetime.now()
datetime.datetime(2019, 7, 13, 17, 40, 1, 505516)  # this is right
>>> timezone.now()
datetime.datetime(2019, 7, 13, 12, 10, 6, 496772, tzinfo=<UTC>)  # this is not what I expect.

即使正确设置了timezone.now(),为什么TIME_ZONE中还是有差异?

1 个答案:

答案 0 :(得分:1)

TIME_ZONE 仅用于模板和表单等。如果 USE_TZ 设置为 True(推荐),则 timezone.now() 将始终设置为 UTC(时间感知) https://docs.djangoproject.com/en/3.1/ref/settings/#std:setting-TIME_ZONE

“..... 这是 Django 用于在模板中显示日期时间和解释在表单中输入的日期时间的默认时区。”

这就是为什么 {{ now|date:"G" }} 打印 16(莫斯科时间)打印莫斯科时间!

另一个注意事项是 timezone.now() 在正常配置的 Django 应用程序中会选择设置中设置的任何 TIME_ZONE(在下面的示例中为“America/New_York”)。但也可以被覆盖(参见下面的巴黎,例如在中间件中或直接在该请求的视图中)

In [27]: timezone.localtime(timezone.now())

Out[27]: datetime.datetime(2021, 2, 23, 1, 53, 49, 793743, tzinfo=<DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)

In [29]: timezone.activate(pytz.timezone("Europe/Paris"))

In [30]: timezone.localtime(timezone.now())

Out[30]: datetime.datetime(2021, 2, 23, 7, 54, 19, 21898, tzinfo=<DstTzInfo 'Europe/Paris' CET+1:00:00 STD>)