Разрешение AmbiguousTimeError из Django make_aware - программирование
Подтвердить что ты не робот

Разрешение AmbiguousTimeError из Django make_aware

У меня есть код следующим образом:

from django.utils.timezone import get_current_timezone, make_aware

make_aware(some_datetime, get_current_timezone())

Иногда вызов make_aware вызывает

AmbiguousTimeError: 2013-11-03 01:23:17

Я знаю из документов Django, что это проблема с дневным сбережением и что эта временная метка на самом деле неоднозначна. Теперь, как я могу его решить (скажем, для первого из двух возможных моментов, когда это может быть)?

4b9b3361

Ответ 1

Prophylactics

В первую очередь следует избегать наивных datetimes, используя следующее:

from django.utils import timezone
now = timezone.now()

Если я, как и я, у вас есть наивные времена, которые вы должны преобразовать, читайте дальше!

Django 1.9 +:

Вы можете разрешить AmbiguousTimeError, используя следующее (благодаря GeyseR):

make_aware(some_datetime, get_current_timezone(), is_dst=False)

Django 1.x - 1.8:

Проблема заключается в том, что make_aware просто вызывает timezone.localize, передавая None в аргумент is_dst:

timezone.localize(value, is_dst=None)

Аргумент is_dst - это то, что используется для разрешения этой неоднозначной ошибки времени (http://pytz.sourceforge.net/#tzinfo-api).

Решение состоит в том, чтобы вызвать timezone.localize самостоятельно:

get_current_timezone().localize(some_datetime, is_dst=False)

Наличие is_dst = False устанавливает его в первое из двух возможных времен. is_dst = True будет вторым.

Ответ 2

Для людей, которые ищут эту ошибку:

В коде Django замените:

    today = datetime.datetime.today()

с

    from django.utils import timezone

    today = timezone.now()

Ответ 3

Так как функция утилиты django 1.9 make_aware имеет параметр is_dst. Поэтому вы можете использовать его для решения исключения AmbiguousTimeError:

    from django.utils.timezone import get_current_timezone, make_aware

    make_aware(some_datetime, get_current_timezone(), is_dst=True)

или

    make_aware(some_datetime, get_current_timezone(), is_dst=False)

Связанный раздел в django docs: https://docs.djangoproject.com/en/1.9/ref/utils/#django.utils.timezone.make_aware