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

问题描述 投票:0回答:1

我对夏令时处理有些困惑。我正在Django 2.0.6框架和python 3.6中的Web通告程序应用程序上工作。此应用程序提供计划通知。例如,用户将消息安排在几个小时之后或几天之后。该网站仅在one时区可用。

我在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中的内容:主要原因是夏令时(DST)。许多国家/地区采用夏令时制,时钟在春季向前移动,在秋季向后移动。如果您是在当地时间工作,那么转换时每年可能会遇到两次错误''

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

谢谢。

django python-3.x python-datetime django-timezone
1个回答
0
投票
您应启用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:30的警报。现在这是模棱两可的了,因为这次将在伦敦发生两次:一次发生在夏令时,一次是在我们回到冬季并将其时钟从凌晨3点移动到凌晨2点之后。但是,如果将其更改为UTC,则不会有任何歧义,只有2020/10/25 2:30 UTC(欧洲/伦敦处于冬季,格林尼治标准时间= UTC)。因此,它必须是1:30或2:30(UTC)。 

所以绝对可以,如果您要在有计划的地方制作应用,请使用USE_TZ,否则DST会有问题。

热门问题
推荐问题
最新问题