从Django的make_aware解析AmbiguousTimeError

时间:2014-01-30 19:17:01

标签: python django timezone dst

我的代码如下:

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文档中了解到这是一个夏令时问题,而且这个时间戳实际上是模棱两可的。现在我该如何解决它(比如这可能是两个可能的时间中的第一个)?

3 个答案:

答案 0 :(得分:15)

预防剂

您应该首先使用以下内容避免天真的日期时间:

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

如果像我一样,你已经有天真的时间,你必须转换,请继续阅读!

Django 1.9 +:

您可以使用以下(thanks to GeyseR)来解决AmbiguousTimeError:

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将是第二个。

答案 1 :(得分:2)

对于搜索此错误的人:

在您的Django代码中,替换:

    today = datetime.datetime.today()

    from django.utils import timezone

    today = timezone.now()

答案 2 :(得分:2)

由于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