我尝试了一些明显的选项,但没有一个可行:
In [150]: x
Out[150]: datetime.date(2012, 9, 1)
In [151]: type(x)
Out[151]: datetime.date
In [152]: isinstance(x, datetime.date)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-152-9a298ea6fce5> in <module>()
----> 1 isinstance(x, datetime.date)
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
In [153]: x is datetime.date
Out[153]: False
In [154]: type(x) is datetime.date
Out[154]: False
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?
oll*_*_uk 92
我相信它在你的例子中不起作用的原因是你是这样导入的datetime:
from datetime import datetime
Run Code Online (Sandbox Code Playgroud)
这会导致你看到的错误
In [30]: isinstance(x, datetime.date)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/<ipython-input-30-9a298ea6fce5> in <module>()
----> 1 isinstance(x, datetime.date)
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
Run Code Online (Sandbox Code Playgroud)
如果您只是这样导入:
import datetime
Run Code Online (Sandbox Code Playgroud)
代码将按所有其他答案中所示运行
In [31]: import datetime
In [32]: isinstance(x, datetime.date)
Out[32]: True
In [33]:
Run Code Online (Sandbox Code Playgroud)
And*_*nez 24
在Python 3.8.4中,可以检查方法 withisinstance在检查 a 是否datetime是 adate或 a时会失败datetime,因为这两个检查都会给出True。
>>> from datetime import datetime, date
>>> mydatetime = datetime.now()
>>> mydate = mydatetime.date()
>>> isinstance(mydatetime, datetime)
True
>>> isinstance(mydatetime, date)
True
Run Code Online (Sandbox Code Playgroud)
这是因为它datetime是 的子类,正如date另一个答案中所解释的那样:
派生类的实例也是基类的实例
因此,在区分datetime和时date,type应该改用:
>>> type(mydatetime) is date
False
>>> type(mydate) is date
True
>>> type(mydate) is datetime
False
>>> type(mydatetime) is datetime
True
Run Code Online (Sandbox Code Playgroud)
您也可以使用==而不是来is比较类型(感谢Tim Tisdall的提醒),但是和之间存在差异==is,并且可能存在性能差异。
Sim*_*ger 12
import datetime
d = datetime.date(2012, 9, 1)
print type(d) is datetime.date
> True
Run Code Online (Sandbox Code Playgroud)
Rom*_*kov 11
根据文档classdate是class的父级datetime。在所有情况下,isinstance()方法都会给你True。如果您需要区分datetime的date,你应该检查类的名称
import datetime
datetime.datetime.now().__class__.__name__ == 'date' #False
datetime.datetime.now().__class__.__name__ == 'datetime' #True
datetime.date.today().__class__.__name__ == 'date' #True
datetime.date.today().__class__.__name__ == 'datetime' #False
Run Code Online (Sandbox Code Playgroud)
当我对日期和日期随时间有不同的格式规则时,我遇到了这个问题
正确的方法是
import datetime
isinstance(x, datetime.date)
Run Code Online (Sandbox Code Playgroud)
当我在我的机器上尝试这个时它工作正常.你需要调查为什么datetime.date不是一个班级.你是否可能用其他东西掩盖它?或者没有正确引用它进行导入?
如果您现有的代码已经依赖from datetime import datetime,您也可以简单地导入date
from datetime import datetime, timedelta, date
print isinstance(datetime.today().date(), date)
Run Code Online (Sandbox Code Playgroud)