【问题标题】:Python NonExistentTimeErrorPython NonExistentTimeError
【发布时间】:2013-03-10 01:11:16
【问题描述】:

我正在创建一个使用访问令牌的简单 Django API。这个想法是,当用户请求令牌时,所述令牌在接下来的 7 小时内有效。

但是,在生成令牌时,我得到了 Python NonExistentTimeError。代码是:

 #Django view
 ...
 expires = datetime.datetime.now() + datetime.timedelta(hours=7)

 token = APIMasterToken.objects.create(
     token=token,
     expiration_date=expires
 )

但是我得到了一个异常,生成了一个带有上述日期的令牌:

NonExistentTimeError at /api/obtain_master_token/
2013-03-10 02:05:12.179508

这个错误是什么意思,我该如何解决?

编辑:我刚刚阅读了文档,当在 DST 之后发生时钟更改的一天发生时,会出现此错误。但是,我不知道如何解决这个问题。 timedelta 函数不应该解决这个问题吗?

【问题讨论】:

  • 实际抛出 NonExistentTimeError 的代码是什么?
  • 保存对象的行:token = API...
  • "timedelta 函数不应该处理这个吗?" - DST 中存在特定于国家/地区的差异,Python 日期时间默认为时区天真,所以这里真的没有什么可以继续的。试试它是否与时区感知 datetime 一起正常工作?

标签: python django python-datetime


【解决方案1】:

Django 期望使用timezone aware datetime objects

根据 Django 文档,now() 调用将变为:

import datetime
from django.utils.timezone import utc

now = datetime.datetime.utcnow().replace(tzinfo=utc)
expires = now + datetime.timedelta(hours=7)

更好的是,使用来自django.utils.timezonenow() 函数。

datetime.now()datetime.utcnow() 都返回朴素的 datetime 对象,这不是 Django 需要的。将时区应用到expires 后,Django 就能够转换回 UTC,以便在数据库后端存储为 UTC。

NonExistentTimeError 实际上是由pytz 模块中的代码抛出的。 pytz documentation 绝对值得一读,因为在处理时区时有很多陷阱。

【讨论】:

    猜你喜欢
    • 2016-01-23
    • 2012-11-02
    • 2023-04-02
    • 2016-11-24
    • 2019-08-21
    • 2010-11-24
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多