无法比较天真和认识datetime.now()<= challenge.datetime_end

我正在尝试使用比较运算符将当前date和时间与模型中指定的date和时间进行比较:

if challenge.datetime_start <= datetime.now() <= challenge.datetime_end: 

脚本错误与:

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

模型看起来像这样:

 class Fundraising_Challenge(models.Model): name = models.CharField(max_length=100) datetime_start = models.DateTimeField() datetime_end = models.DateTimeField() 

我也有django使用区域date和时间。

我无法find的是django用于DateTimeField()的格式。 这是天真的还是意识到的? 如何获取datetime.now()来识别区域date?

datetime.datetime.now不是时区感知的。

Django为此提供了一个帮助器,它需要pytz

 from django.utils import timezone now = timezone.now() 

您应该能够now比较challenge.datetime_start

默认情况下, datetime对象在Python中是naive的,所以你需要使它们都是天真的或意识到的datetime对象。 这可以使用。

 import datetime import pytz utc=pytz.UTC challenge.datetime_start = utc.localize(challenge.datetime_start) challenge.datetime_end = utc.localize(challenge.datetime_end) # now both the datetime objects are aware, and you can compare them 

注意:如果tzinfo已经设置,这会引发ValueError 。 如果你不确定,就用

 start_time = challenge.datetime_start.replace(tzinfo=utc) end_time = challenge.datetime_end.replace(tzinfo=utc) 

顺便说一句,你可以在datetime.datetime对象中用时区信息格式化一个UNIX时间戳,如下所示

 d = datetime.datetime.utcfromtimestamp(int(unix_timestamp)) d_with_tz = datetime.datetime( year=d.year, month=d.month, day=d.day, hour=d.hour, minute=d.minute, second=d.second, tzinfo=pytz.UTC) 

一行代码解决scheme

 if timezone_aware_var <= datetime.datetime.now(timezone_aware_var.tzinfo): pass #some code 

解释版本:

 # Timezone info of your timezone aware variable timezone = your_timezone_aware_variable.tzinfo # Current datetime for the timezone of your variable now_in_timezone = datetime.datetime.now(timezone) # Now you can do a fair comparison, both datetime variables have the same time zone if your_timezone_aware_variable <= now_in_timezone: pass #some code 

Sumary:
您必须将时区信息添加到您的now()date时间。
但是您必须添加参考variables的相同时区; 这就是为什么我第一次阅读tzinfo属性。

所以我要解决这个问题的方法是确保两个date时间在正确的时区。

我可以看到你正在使用datetime.now() ,它将返回系统当前时间,没有设置tzinfo。

tzinfo是附加到date时间的信息,让它知道它是在什么时区。如果你使用天真的date时间,你需要在整个系统中保持一致。 我强烈build议只使用datetime.utcnow()

看到你正在创build的date时间有tzinfo与他们相关联,你需要做的是确保这些是本地化(具有tzinfo关联)到正确的时区。

看一下Delorean ,它使得处理这种事情变得更容易。