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

时间:2013-03-09 05:38:56

标签: python django datetime comparison

我试图将当前日期和时间与使用比较运算符的模型中指定的日期和时间进行比较:

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。

我无法找到的是django用于DateTimeField()的格式。是天真还是意识到?如何让datetime.now()识别语言环境日期时间?

10 个答案:

答案 0 :(得分:88)

默认情况下,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

注意:如果已设置ValueError,则会引发tzinfo。如果您不确定,请使用

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

BTW,您可以使用时区信息格式化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)

答案 1 :(得分:66)

datetime.datetime.now不支持时区。

Django为此提供了一个帮手,需要pytz

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

您应该可以将nowchallenge.datetime_start

进行比较

答案 2 :(得分:34)

一行代码解决方案

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

要点:
您必须将时区信息添加到now()日期时间 但是,您必须添加引用变量的相同时区;这就是我第一次阅读tzinfo属性的原因。

答案 3 :(得分:8)

禁用时区。 使用= ? WHERE (

您还可以将='1') "; $update = app('db')->update($query, [$passenger->name,]);用于其他日期时间

challenge.datetime_start.replace(tzinfo=None);

答案 4 :(得分:4)

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

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

tzinfo是附加到日期时间的信息,让它知道它所在的时区。如果您使用的是天真的日期时间,则需要在整个系统中保持一致。我强烈建议仅使用datetime.utcnow()

在某处您正在创建与其关联的tzinfo的日期时间,您需要做的是确保它们已本地化(已关联tzinfo)到正确的时区。

看看Delorean,它可以更轻松地处理这类事情。

答案 5 :(得分:0)

这是我的工作方式。 在这里,我对创建的datetime表进行了设置,并在datetime上添加了10分钟。 稍后根据当前时间,完成到期操作。

from datetime import datetime, time, timedelta
import pytz

在数据库日期时间增加了10分钟

table_datetime ='2019-06-13 07:49:02.832969'(示例)

# Added 10 minutes on database datetime
# table_datetime = '2019-06-13 07:49:02.832969' (example)

table_expire_datetime = table_datetime + timedelta(minutes=10 )

# Current datetime
current_datetime = datetime.now()


# replace the timezone in both time
expired_on = table_expire_datetime.replace(tzinfo=utc)
checked_on = current_datetime.replace(tzinfo=utc)


if expired_on < checked_on:
    print("Time Crossed)
else:
    print("Time not crossed ")

对我有用。

答案 6 :(得分:0)

只是:

boost

这样做:

dt = datetimeObject.strftime(format) # format = your datetime format ex) '%Y %d %m'
dt = datetime.datetime.strptime(dt,format)

,然后使用start_time = challenge.datetime_start.strftime('%Y %d %m %H %M %S') start_time = datetime.datetime.strptime(start_time,'%Y %d %m %H %M %S') end_time = challenge.datetime_end.strftime('%Y %d %m %H %M %S') end_time = datetime.datetime.strptime(end_time,'%Y %d %m %H %M %S') start_time

答案 7 :(得分:0)

您正试图为已经具有时区的date_time设置时区。 使用replaceastimezone函数。

local_tz = pytz.timezone('Asia/Kolkata')

current_time = datetime.now().replace(tzinfo=pytz.utc).astimezone(local_tz)

答案 8 :(得分:0)

在settings.py文件中执行此操作:

USE_TZ = False

我遇到了同样的错误,它已经解决了该错误

答案 9 :(得分:0)

没有第三方,只有原生的日期时间模块。

from datetime import datetime, timedelta, timezone

time1 = datetime.strptime('2021-07-15T00:22:02+0000', '%Y-%m-%dT%H:%M:%S%z')
time2 = datetime(2021, 7, 15, tzinfo=timezone(offset=timedelta()))
if time1 < time2:
    print(True)