在使用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
这样就不会出现问题了