Jelajahi Sumber

Handle pytz.AmbiguousTimeError. Closes #1061

Ask Solem 12 tahun lalu
induk
melakukan
ea4581f4de
1 mengubah file dengan 14 tambahan dan 6 penghapusan
  1. 14 6
      celery/utils/timeutils.py

+ 14 - 6
celery/utils/timeutils.py

@@ -16,7 +16,7 @@ from datetime import date, datetime, timedelta, tzinfo
 
 
 from kombu.utils import cached_property, reprcall
 from kombu.utils import cached_property, reprcall
 
 
-from pytz import timezone as _timezone
+from pytz import timezone as _timezone, AmbiguousTimeError
 
 
 from celery.five import string_t
 from celery.five import string_t
 
 
@@ -266,23 +266,31 @@ def is_naive(dt):
 def make_aware(dt, tz):
 def make_aware(dt, tz):
     """Sets the timezone for a datetime object."""
     """Sets the timezone for a datetime object."""
     try:
     try:
-        localize = tz.localize
+        _localize = tz.localize
     except AttributeError:
     except AttributeError:
         return dt.replace(tzinfo=tz)
         return dt.replace(tzinfo=tz)
     else:
     else:
         # works on pytz timezones
         # works on pytz timezones
-        return localize(dt, is_dst=None)
+        try:
+            return _localize(dt, is_dst=None)
+        except AmbiguousTimeError:
+            return min(_localize(dt, is_dst=True),
+                       _localize(dt, is_dst=False))
 
 
 
 
 def localize(dt, tz):
 def localize(dt, tz):
     """Convert aware datetime to another timezone."""
     """Convert aware datetime to another timezone."""
     dt = dt.astimezone(tz)
     dt = dt.astimezone(tz)
     try:
     try:
-        normalize = tz.normalize
-    except AttributeError:
+        _normalize = tz.normalize
+    except AttributeError:  # non-pytz tz
         return dt
         return dt
     else:
     else:
-        return normalize(dt)  # pytz
+        try:
+            return _normalize(dt, is_dst=None)
+        except AmbiguousTimeError:
+            return min(_normalize(dt, is_dst=True),
+                       _normalize(dt, is_dst=False))
 
 
 
 
 def to_utc(dt):
 def to_utc(dt):