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

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()识别区域日期时间?


当前回答

禁用时区。 使用challenge.datetime_start.replace (tzinfo = None);

您还可以对其他日期时间使用replace(tzinfo=None)。

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

其他回答

您正在尝试为date_time设置时区,而date_time已经有一个时区。 使用replace和astimezone函数。

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

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

如果您使用的是Python 3.6及更新版本,则可以利用本机datetime功能。

utc_date = datetime.datetime.fromtimestamp(0, datetime.timezone.utc)

只是:

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和end_time

它在我身上起作用。 在这里,我正在获取创建datetime的表,并在datetime上添加10分钟。 之后根据当前时间,将执行过期操作。

from datetime import datetime, time, timedelta
import pytz

在数据库datetime上增加了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 ")

这对我很管用。

在我的例子中,我已经用pytz控制了时区,我已经用django.utils的时区将日期转换为本机:

import pytz
from django.utils import timezone

def _my_method(native_date, timezone):
    aware_date = datetime.now(pytz.timezone(timezone))
    return timezone.make_naive(aware_date) >  native_date

你也可以使用timezone.make_aware来感知本地日期