无法在 django 中减去日期时间和时间戳?

Posted

技术标签:

【中文标题】无法在 django 中减去日期时间和时间戳?【英文标题】:Can't subtract datetime and timestamp in django? 【发布时间】:2012-05-22 14:03:29 【问题描述】:

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

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

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

我该如何解决这个问题?

【问题讨论】:

Can't subtract offset-naive and offset-aware datetimes 的可能重复项 【参考方案1】:

这个错误是指python存储时间的方式。根据pythondocumentation:

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

django documentation 还声明:

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

import datetime
now = datetime.datetime.now() 

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

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

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

naive_dt = aware_dt.replace(tzinfo=None)

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

【讨论】:

【参考方案2】:

你好 简短的回答是:

tz_info = your_timezone_aware_variable.tzinfo

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

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

【讨论】:

以上是关于无法在 django 中减去日期时间和时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

在PHP中减去日期[重复]

在Perl中减去两个日期字符串,转换为unix时间并还原

如何从日期时间中减去秒并进行比较?

如何用Python在指定日期上减去7天?

Apache Spark 从时间戳列中减去天数

减去 2 个日期得到天数