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?

Вернуться на верх