【问题标题】:Resolving AmbiguousTimeError from Django's make_aware从 Django 的 make_aware 中解决 AmbiguousTimeError
【发布时间】: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 文档中知道这是一个夏令时问题,而且这个时间戳实际上是模棱两可的。现在我该如何解决它(比如说这可能是两个可能的时间中的第一个)?

【问题讨论】:

    标签: python django timezone dst


    【解决方案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 将是第二个。

    【讨论】:

    【解决方案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() 也会返回幼稚的日期时间对象。
      猜你喜欢
      • 2012-10-26
      • 2016-01-17
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      相关资源
      最近更新 更多