Django 2 和 python 3 中时区和日期时间库的问题

problem with timezone and datetime libs in Django 2 and python 3

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

我在 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() return 给我 datetime with tzinfo UTCdatetime.now() return 给我正确的时间信息时区信息。当我在 django 设置中设置 USE_TZ=False 以在 django return 中找到 timezone.now() 时,正确的时区信息如 datetime.now()。在 Django time zone document 中说:''This is handy if your users live in more than one time zone and you want to display datetime information according to each user’s wall clock.good practice to store data in UTC in your database. The main reason is Daylight Saving Time (DST). Many countries have a system of DST, where clocks are moved forward in spring and backward in autumn. If you’re working in local time, you’re likely to encounter errors twice a year, when the transitions happen''

根据我的项目类型,我正在寻找 Django 设置项目中时区配置的最佳实践,并解决该问题 Django 在时间文档中讨论了该问题。请帮助我

谢谢。

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

timezone.now() 应该给你 14:28 和 tzinfo=UTC,而在伦敦它是 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:30am。现在这是模棱两可的,因为这个时间在伦敦会出现两次:一次是在夏令时期间,一次是在我们回到冬令时并将时钟从凌晨 3 点调到凌晨 2 点之后的一个小时后。但是如果你把这个改成UTC,这样就不会有歧义了,只有一个2020/10/25 2:30 UTC(当Europe/London是冬令时,GMT = UTC)。所以它必须是 1:30 或 2:30 (UTC)。

所以,如果您正在制作一个有日程安排的应用程序,请使用 USE_TZ 否则您会遇到夏令时问题。