从 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:从请求的数据流中读取后,您无法访问正文