Django中offset-naive 和 offset-aware 时间的计算

在使用Django时,默认是开启对多时区的支持的,在获取时间的时候会是如下形式:

datetime.datetime(2019, 9, 14, 12, 23, 7, tzinfo=)

通过ORM将当前的时间存入数据库后,便会有自动加入tzinfo。

有时候,我们需要将该时间与当前时间做比较,例如计算差值,将数据库中的时间直接拿出来:

(datetime.datetime.now() - models.DateTimeField).seconds

这样做的话会报错,如下:

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

问题就出在利用datetime.datetime.now()得到的当前时间是offset-naive的,这一个时间是没有tzinfo的,而另外一个从数据库取出来的却是offset-aware的。如果将数据库里面的时间信息print一下出来的话,它会比通过 datetime.datetime.now() 函数的出来的时间多一个类似 +0:00 的东西。因此我们需要将这里的数据库中的时间带有的tzinfo去掉:

models.DateTimeField.replace(tzinfo=None)

然后计算时间:

(datetime.datetime.now() - models.DateTimeField.replace(tzinfo=None).seconds

这样就不会出现问题了