【问题标题】:problem with timezone and datetime libs in Django 2 and python 3Django 2 和 python 3 中时区和日期时间库的问题
【发布时间】:2020-07-18 13:08:11
【问题描述】:

我对夏令时处理有点困惑。我在 Django 2.0.6 框架和 python 3.6 中开发网络通知程序应用程序。此应用程序提供调度通知。例如,用户将消息安排在几个小时后或几天后。本网站仅适用于一个时区。

我在 Django 中使用过这个设置:

...

TIME_ZONE = 'Europe/London'
USE_I18N = True
USE_L10N = True
USE_TZ = True

...

当我在python manage.py shell 中运行此代码时:

>>> from django.utils import timezone
>>> from datetime import datetime
>>> timezone.now()
>>> datetime.now()

django timezone.now() 使用 tzinfo UTC 返回给我日期时间,datetime.now() 使用正确的时区信息返回给我正确的时间信息。当我在 django 设置中创建 USE_TZ=False 以在 django 中找出 timezone.now() 时,返回正确的时区信息,如 datetime.now()。在Django time zone document 中说:''如果您的用户居住在多个时区并且您希望根据每个用户的挂钟显示日期时间信息,这将很方便。在数据库中以 UTC 格式存储数据的好习惯。主要原因是夏令时(DST)。许多国家都有夏令时制度,时钟在春季向前走,在秋季向后走。如果你是在当地时间工作,你很可能一年会遇到两次错误,当转换发生时''

根据我的项目类型,我正在寻找在我的 Django 设置项目中进行时区配置的最佳实践,并解决 Django 在时间文档中谈到的问题。请帮帮我

谢谢。

【问题讨论】:

    标签: django python-3.x python-datetime django-timezone


    【解决方案1】:

    您应该启用USE_TZ。如果你仔细看,你会发现datetime.now() 没有指定时区(原始时间),而timezone.now() 指定了(时区感知时间)。使用USE_TZ=True,所有 datetime 对象都转换为绝对 UTC 时间和时区感知,因此对于实际时间点没有歧义。

    timezone.now() 应该在 tzinfo=UTC 的情况下给您 14:28,而在伦敦是 15:28(现在是四月):

    >>> timezone.now()
    datetime.datetime(2020, 4, 6, 14, 41, 13, 296983, tzinfo=<UTC>)
    >>> datetime.now()
    datetime.datetime(2020, 4, 6, 15, 42, 3, 320929)  # no tzinfo
    

    假设您的用户设置了 2020 年 10 月 25 日凌晨 2:30 的闹钟。现在这是模棱两可的,因为这个时间将在伦敦发生两次:一次在 DST 期间,一个小时后我们回到冬季时间并将时钟从凌晨 3 点移至凌晨 2 点。但是,如果您将其更改为 UTC,则不会有歧义,只有一个 2020/10/25 2:30 UTC(当欧洲/伦敦在冬季时,GMT = UTC)。所以它必须是 1:30 或 2:30 (UTC)。

    因此,如果您要制作有计划的应用,请务必使用USE_TZ,否则您会遇到有关 DST 的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 2017-09-30
      • 1970-01-01
      • 2022-08-18
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多