11

我在数据库中有一个字段 timestamp = models.DateTimeField(auto_now_add=True)。我想找出那个时间戳和 datetime.now() 之间的区别。

当我尝试 datetime.now() - 时间戳时,我得到了错误:

can't subtract offset-naive and offset-aware datetimes

我该如何解决?

4

2 回答 2

22

此错误是指 python 存储时间的方式。根据python文档

有两种日期和时间对象:“naive”和“aware”。这种区别是指对象是否具有任何时区、夏令时或其他类型的算法或政治时间调整的概念。

django文档还指出:

当禁用时区支持时,Django 在本地时间使用天真的日期时间对象。这对于许多用例来说既简单又足够。在这种模式下,要获取当前时间,您可以编写:

import datetime
now = datetime.datetime.now() 

当启用时区支持时,Django 使用时区感知的日期时间对象。如果您的代码创建了日期时间对象,他们也应该知道。在这种模式下,上面的例子变成:

import datetime
from django.utils.timezone import utc
now = datetime.datetime.utcnow().replace(tzinfo=utc)

您应该确定是否要在您的站点中了解时区,然后相应地调整您存储的时间。要将有意识的 dt 转换为 naive,您可以使用pytz 模块并执行以下操作:

naive_dt = aware_dt.replace(tzinfo=None)

这是有效的,因为所有 python 日期时间都有一个可选的时区属性,tzinfo可用于存储 dt 与 UTC 时间的偏移量的信息。

于 2012-05-15T05:16:40.723 回答
0

Holá
简短的回答是:

tz_info = your_timezone_aware_variable.tzinfo

diff = datetime.datetime.now(tz_info) - your_timezone_aware_variable:

您必须将时区信息添加到您的 now() 时间。
但是您必须添加变量的相同时区,这就是我首先阅读 tzinfo 属性的原因。

于 2015-10-03T19:03:18.420 回答