【问题标题】:Django - TIME_ZONE and timezone.now()Django - TIME_ZONE 和 timezone.now()
【发布时间】:2019-07-13 12:11:36
【问题描述】:

我有以下设置:-

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

另外,我在我的DateTimeField 中设置了auto_now = True。但是,保存在 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.

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

【问题讨论】:

  • official documentation 中的第一句:“启用时区支持后,Django 将日期时间信息以 UTC 格式存储在数据库中,在内部使用时区感知的日期时间对象,并对其进行翻译到模板和表单中的最终用户的时区。”
  • 我应该将USE_TZ 设置为False 吗?
  • 如果您没有任何用户的位置与您的服务器位于不同的时区,那么可以 - 或者直接删除该行,因为它默认为 False。

标签: python django django-timezone


【解决方案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”)。但也可以被覆盖(参见下面的 Paris,例如在中间件中或直接在该请求的视图中)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多