从 Django 的 make_aware 中解决 AmbiguousTimeError

Posted

技术标签:

【中文标题】从 Django 的 make_aware 中解决 AmbiguousTimeError【英文标题】:Resolving AmbiguousTimeError from Django's make_aware 【发布时间】:2014-02-23 06:56:41 【问题描述】:

我的代码如下:

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

【问题讨论】:

【参考方案1】:

预防措施

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

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

【讨论】:

一个更好的解决方案是尽可能避免幼稚的日期时间对象,例如@Michael van de Waeter has suggested。注意:localize(is_dst=False)可能会产生一个不存在的时间,调用.normalize()调整它,见"Can I just always set is_dst=True?" @J.F.Sebastian 非常感谢,这很有建设性。【参考方案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)

Related section in django docs

【讨论】:

【参考方案3】:

对于搜索此错误的人:

在您的 Django 代码中,替换:

    today = datetime.datetime.today()

    from django.utils import timezone

    today = timezone.now()

【讨论】:

确实,它可以解决根本原因(如果today 是日期时间对象的单一来源,则会生成天真的日期时间)。您应该使用USE_TZ=True,否则timezone.now() 也会返回幼稚的日期时间对象。

以上是关于从 Django 的 make_aware 中解决 AmbiguousTimeError的主要内容,如果未能解决你的问题,请参考以下文章

67.ORM查询条件:range的使用,使用make_aware将navie time 转换为aware time

(已解决):-)(React 和 Django)我无法从我的用户列表中删除用户。 (HTTP 状态码 404)

如何解决 VS Code 中的“无法从源代码解析导入“django.contrib”?

Django - RawPostDataException:从请求的数据流中读取后,您无法访问正文

在 Django 中,如何从扩展的 HTML 模板中链接静态文件?

Django - 如何从外部源动态显示图像