проблема с часовыми поясами и датами времени в Django 2 и python 3 - PullRequest
0 голосов
/ 06 апреля 2020

Меня немного смущает переход на летнее время. Я работаю над приложением веб-уведомлений в Django 2.0.6 framework и 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 UT C и datetime.now() верните мне правильную информацию о времени с правильной информацией о часовом поясе. когда я установил USE_TZ=False в django, чтобы узнать timezone.now() в django, верните правильную информацию о часовом поясе, такую ​​как datetime.now(). в Django документе о часовом поясе сказано: '' Это удобно, если ваши пользователи живут более чем в одном часовом поясе и вы хотите отображать информацию о дате и времени в соответствии с настенными часами каждого пользователя. хранить данные в UT C в вашей базе данных. Основной причиной является летнее время (DST). Во многих странах существует система DST, где часы перемещаются вперед весной и назад осенью. Если вы работаете по местному времени, вы, вероятно, будете сталкиваться с ошибками два раза в год, когда происходят переходы ''

В зависимости от типа моего проекта, я ищу то, что является лучшим попрактикуйтесь в настройке часового пояса в моем проекте настроек Django и решите эту проблему Django поговорим об этом во временной документации. Пожалуйста, помогите мне

Спасибо.

1 Ответ

0 голосов
/ 06 апреля 2020

Вы должны включить USE_TZ. Если вы посмотрите внимательно, вы увидите, что datetime.now() не указывает часовой пояс (начальное время), а timezone.now() - время, учитывающее часовой пояс). С USE_TZ=True все объекты даты и времени преобразуются в абсолютное время UT C с учетом времени и часового пояса, поэтому нет никакой двусмысленности относительно фактического момента времени.

timezone.now() должно дать вам 14:28 с tzinfo = UT C когда в Лондоне 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

Представьте, что ваш пользователь устанавливает будильник на 25 октября 2020 года, 2:30. Теперь это неоднозначно, поскольку это время будет происходить дважды в Лондоне: один раз во время летнего времени и через час после того, как мы вернулись в зимнее время и перевели наши часы с 3 до 2 часов. Но если вы измените это на UT C, это не будет двусмысленным, есть только один 2020/10/25 2:30 UT C (когда Европа / Лондон в зимнее время, когда GMT = UT C) , Так что это должно быть 1:30 или 2:30 (UT C).

Так что определенно, если вы создаете приложение, в котором есть расписание, используйте USE_TZ, иначе у вас будут проблемы с летним временем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...