Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t比较naive和aware datetime.now()<;=challenge.datetime\u结束_Python_Django_Datetime_Comparison - Fatal编程技术网

Python Can';t比较naive和aware datetime.now()<;=challenge.datetime\u结束

Python Can';t比较naive和aware datetime.now()<;=challenge.datetime\u结束,python,django,datetime,comparison,Python,Django,Datetime,Comparison,我试图使用比较运算符将当前日期和时间与模型中指定的日期和时间进行比较: if challenge.datetime_start <= datetime.now() <= challenge.datetime_end: 模型如下所示: class Fundraising_Challenge(models.Model): name = models.CharField(max_length=100) datetime_start = models.DateTimeFie

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

if challenge.datetime_start <= datetime.now() <= challenge.datetime_end:
模型如下所示:

class Fundraising_Challenge(models.Model):
    name = models.CharField(max_length=100)
    datetime_start = models.DateTimeField()
    datetime_end = models.DateTimeField()
我还让django使用区域设置日期和时间


我没有找到django用于DateTimeField()的格式。它是天真的还是有意识的?如何获取datetime.now()以识别区域设置datetime?

默认情况下,Python中的
datetime
对象是
naive
,因此您需要将它们都设置为naive或aware
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)

datetime.datetime.now
不知道时区

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

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

您应该能够将
现在
挑战。datetime\u start

进行比较,因此我解决此问题的方法是确保两个datetime位于正确的时区

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

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

鉴于您正在创建与tzinfo关联的datetime,您需要做的是确保这些datetime已本地化(与tzinfo关联)到正确的时区

看一看,这让处理这类事情变得容易多了

一行代码解决方案
if timezone\u aware\u var禁用时区。
使用
challenge.datetime\u 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):
如果challenge.datetime\u start.replace(tzinfo=None)它正在从我这里工作。
在这里,我将创建datetime表,并在datetime上添加10分钟。
稍后,根据当前时间,将执行到期操作

from datetime import datetime, time, timedelta
import pytz
增加了10分钟的数据库日期时间

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

#在数据库datetime上增加了10分钟
#表_datetime='2019-06-13 07:49:02.832969'(示例)
表\u expire\u datetime=表\u datetime+timedelta(分钟=10)
#当前日期时间
current_datetime=datetime.now()
#在两个时间段中替换时区
expired\u on=table\u expire\u datetime.replace(tzinfo=utc)
选中日期=当前日期时间。替换(tzinfo=utc)
如果过期_on<已检查_on:
打印(“时间交叉”)
其他:
打印(“时间未交叉”)
这对我很有效。

只是:

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\u time
end\u time

您正在尝试为已经有时区的date\u time设置时区。 使用
replace
astimezone
功能

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

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

有一个非常好的库可以玩,date:Belmony(我没有附属关系)它在尝试计算时说:ValueError:NotNaive datetime(tzinfo已经设置好了):datetimeStart=utc.localize(challenge.datetime\u start)是的,它会引发ValueError。替换
tzinfo
不会进行任何转换,使比较不正确。+1。并且,使用
utc=pytz.utc
来防止pylint错误
在未绑定的方法调用中参数“dt”没有值(参数没有值)
。如果
使用\u TZ=True
时区。now()
即使未安装
pytz
也会返回时区感知的日期时间对象(尽管出于其他原因建议安装)。utcnow也会出现此问题。这解决了meThis的问题,这似乎是最合理的方法-谢谢!
# 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 ")
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')
local_tz = pytz.timezone('Asia/Kolkata')

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