问题描述

1
2
3
4
5
6
7
8
>>> import datetime
>>> from django.utils import timezone
>>> naive = datetime.datetime.utcnow()
>>> aware = timezone.now()
>>> naive == aware
Traceback (most recent call last):
...
TypeError: can't compare offset-naive and offset-aware datetimes

解决问题

当遇到这种问题,首先要了解一下 offset-naiveoffset-aware 是如何生成的

  • 由Django生成的datetime,例如,从model的字段中读取的值,当Django开启时区支持USE_TZ = True,该值就是aware
  • 由Python原生生成的datetime,就是naive

因此,问题的解决就是改变一下datetime即可,aware=>naive 或者 naive=>aware

创建一个aware datetime

1
2
>>> import pytz
>>> aware = datetime.datetime.utcnow().replace(tzinfo=pytz.UTC)

这样就生成了一个UTC时区的创建一个 aware datetime

另外一个方法

在Django中一个配置USE_TZ,该配置会影响django.utils.timezone.now()函数的返回,当 USE_TZ = False 返回 naive datetime,当 USE_TZ = True 返回 aware datetime

因此, 配置 USE_TZ = False 后即可与 datetime.timedelta 等进行计算比较等操作