Resolving AmbiguousTimeError from Django's make_aware

寵の児 提交于 2019-12-04 00:42:13
Zags

Prophylactics

You should avoid naive datetimes in the first place using the following:

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

If like me, you have naive times already that you must convert, read on!

Django 1.9+:

You can resolve the AmbiguousTimeError by using the following (thanks to GeyseR):

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

Django 1.x - 1.8:

The problem is that make_aware just calls timezone.localize, passing None to the argument is_dst:

timezone.localize(value, is_dst=None)

The argument is_dst is specifically what is used to resolve this ambiguous time error (http://pytz.sourceforge.net/#tzinfo-api).

The solution is to call timezone.localize yourself:

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

Having is_dst=False sets it to the first of the two possible times. is_dst=True would be the second.

Since django 1.9 make_aware utility function has is_dst parameter. So you can use it for solving AmbiguousTimeError exception:

    from django.utils.timezone import get_current_timezone, make_aware

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

or

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

Related section in django docs: https://docs.djangoproject.com/en/1.9/ref/utils/#django.utils.timezone.make_aware

For people searching on this error:

In your Django code, replace:

    today = datetime.datetime.today()

with

    from django.utils import timezone

    today = timezone.now()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!