无法比较天真和认识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 ,它使得处理这种事情变得更容易。