从Django的make_aware解析AmbiguousTimeError

Zag*_*ags 12 python django timezone dst

我有一个代码如下:

from django.utils.timezone import get_current_timezone, make_aware

make_aware(some_datetime, get_current_timezone())
Run Code Online (Sandbox Code Playgroud)

make_aware呼叫偶尔引发

AmbiguousTimeError: 2013-11-03 01:23:17
Run Code Online (Sandbox Code Playgroud)

我从Django文档中了解到这是一个夏令时问题,而且这个时间戳实际上是模棱两可的.现在我该如何解决它(比如这可能是两个可能的第一个)?

Zag*_*ags 17

避孕药

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

from django.utils import timezone
now = timezone.now()
Run Code Online (Sandbox Code Playgroud)

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

Django 1.9+:

您可以使用以下方法解决AmbiguousTimeError(感谢GeyseR):

make_aware(some_datetime, get_current_timezone(), is_dst=False)
Run Code Online (Sandbox Code Playgroud)

Django 1.x - 1.8:

问题是make_aware只调用timezone.localize,将None传递给参数is_dst:

timezone.localize(value, is_dst=None)
Run Code Online (Sandbox Code Playgroud)

参数is_dst具体用于解决这种模糊的时间错误(http://pytz.sourceforge.net/#tzinfo-api).

解决方案是自己调用timezone.localize:

get_current_timezone().localize(some_datetime, is_dst=False)
Run Code Online (Sandbox Code Playgroud)

将is_dst = False设置为两次可能的第一次.is_dst = True将是第二个.


Gey*_*seR 5

从 django 1.9 开始 make_aware 实用函数有is_dst参数。所以你可以用它来解决 AmbigouslyTimeError 异常:

    from django.utils.timezone import get_current_timezone, make_aware

    make_aware(some_datetime, get_current_timezone(), is_dst=True)
Run Code Online (Sandbox Code Playgroud)

或者

    make_aware(some_datetime, get_current_timezone(), is_dst=False)
Run Code Online (Sandbox Code Playgroud)

django 文档中的相关部分