Разрешение 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, что это проблема с дневным сбережением и что эта временная метка на самом деле неоднозначна. Теперь, как я могу его решить (скажем, для первого из двух возможных моментов, когда это может быть)?
Ответы
Ответ 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