Django: Попытка добавить 'SHORT_TIME_FORMAT' почему-то меняет часовой пояс на Chicargo
Мне потребовалось несколько дополнительных форматов даты/времени в дополнение к тем, с которыми поставляется Django, и я создал эти новые форматы:
SHORT_TIME_FORMAT
FILE_DATETIME_FORMAT
ISO8601_DATETIME_FORMAT
.
Чтобы я мог использовать их в шаблонах, например, так:
{{ value|date:"SHORT_DATE_FORMAT" }}
И в коде, подобном этому:
from django.utils import formats
formats.date_format(value, `SHORT_TIME_FORMAT`)
Я создал следующий код в utils/time/formats.py
:
from collections import ChainMap
from django.utils import formats
DJANGO_DATETIME_FORMATS = {
'DATETIME_FORMAT': 'd M Y, H:i',
'DATE_FORMAT': 'j M Y',
'TIME_FORMAT': 'H:i:s',
'SHORT_DATETIME_FORMAT': 'Y-m-d H:i:s',
'SHORT_DATE_FORMAT': 'Y-m-d',
'MONTH_DAY_FORMAT': 'd M',
'YEAR_MONTH_FORMAT': 'Y M',
}
EXTRA_DATETIME_FORMATS = {
'SHORT_TIME_FORMAT': 'H:i',
'FILE_DATETIME_FORMAT': 'Y-m-d H.i.s',
'ISO8601_DATETIME_FORMAT': 'c', # Compatible with Javascript passing
}
def set_formats(globals_dict):
"""Returns a set of datetime formats for use across the whole project
Contains a union of the default formats along with the additional ones.
To add a new format, one has to perform the following two actions:
1. Add the name of the format to formats.FORMAT_SETTINGS
2. Add a variable with the same name as the variable to the settings.py
file with the value assigned to the required format.
globals_dict is the globals from the settings.py file
"""
formats.FORMAT_SETTINGS = frozenset(formats.FORMAT_SETTINGS | EXTRA_DATETIME_FORMATS.keys())
all_formats = ChainMap(DJANGO_DATETIME_FORMATS, EXTRA_DATETIME_FORMATS)
for setting, value in all_formats.items():
globals_dict[setting] = value
Однако когда я добавляю его в свой settings.py
файл так:
# settings.py
from utils.time.formats import set_formats
set_formats(globals())
Мой часовой пояс меняется на Chicargo, хотя в settings.py
у меня есть:
TIME_ZONE = 'Africa/Johannesburg'
После исследования я обнаружил, что часовой пояс Django по умолчанию - Chicargo, что на 7 часов позже меня (у меня UTC+02).
Я могу проверить это следующим образом:
$ python manage.py shell
> from django.utils import timezone
> from django.conf import settings
> print(f"The settings.py TIME_ZONE value is: {settings.TIME_ZONE=}")
The settings.py TIME_ZONE value is: settings.TIME_ZONE='Africa/Johannesburg'
> print("Using Django local time, now is:")
Using Django local time, now is:
> print(timezone.localtime())
2022-07-27 20:54:35.293958+02:00
Если я не использую set_formats
, то время правильно отображается в моем местном времени, если я добавляю свою функцию set_formats
, то время смещается на 7 часов, и в интерфейсе администратора и другие даты/время на моем сайте все смещены на 7 часов, хотя settings.TIME_ZONE
сообщает Africa/Johannesburg
.
Этот код раньше работал, но в какой-то момент недавно перестал работать. Я изменил pytz
на zoneinfo
, так что это может быть причиной, но я был немного уверен, что он работает после изменения.
Почему меняется часовой пояс? Как добавить формат даты/времени, чтобы его можно было использовать в шаблонах и в коде с помощью функции django.utils.formats.date_format
?