I have a code as follows:
from django.utils.timezone import get_current_timezone, make_aware
make_aware(some_datetime, get_current_timezone())
The make_aware
call occasionally raises
AmbiguousTimeError: 2013-11-03 01:23:17
I know from the Django docs that this is a daylight savings problem, and that this timestamp is in fact ambiguous. Now how do i resolve it (say to the first of the two possible times this could be)?
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!
Starting in Django 4, if you use zoneinfo
for timezone support (which is the default in Django 4) there's nothing you need to do to use make_aware
to avoid this error. The is_dst
flag to make_aware is deprecated in Django 4 and will be removed in Django 5.
You can resolve the AmbiguousTimeError by using the following (thanks to GeyseR):
from django.utils import timezone
# This uses `settings.TIME_ZONE` unless you call `timezone.activate()`
timezone.make_aware(some_datetime, is_dst=False)
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.