2013-04-22 233 views
28

我已经尝试了几个明显的选择,但他们没有工作:Python:如何检查对象是否为datetime.date类型?

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 

什么是这样做的正确方法吗?

+3

你可以产生[SSCCE(http://sscce.org)?我应该认为一个四线或五线方案就足够了。我[无法重现您的结果](http://ideone.com/gqdou2)。 – 2013-04-22 16:02:07

+1

您使用的是什么Python版本?对于Python-2.6'isinstance(x,datetime.date)''可以正常工作,因为'type(x)是datetime.date' – RedBaron 2013-04-22 16:03:25

+0

您正在使用哪种版本的Python,以及您是如何生成'x'的? – 2013-04-22 16:03:40

回答

55

我相信这是不是在你的榜样工作的原因是你已经导入datetime像这样:

from datetime import datetime 

这会导致你看到

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 

,如果你的错误只需像这样导入:

import datetime 

的代码将在所有其他答案的运行如图所示

In [31]: import datetime 

In [32]: isinstance(x, datetime.date) 
Out[32]: True 

In [33]: 
+3

+1漂亮的侦探工作。 – 2013-04-22 16:08:16

+1

如果你有一个日期时间(而不仅仅是一个日期),扩展你可以做:'x = datetime.datetime.now()'然后'isinstance(x,datetime.datetime)' – fantabolous 2014-08-11 05:28:07

+4

那么,如果你想要区分datetime.date和datetime.datetime,此方法将失败: '>>> import datetime' '>>> foo = datetime.datetime.now()' >>> >>> isinstance(foo,datetime.date) '' TRUE' .__ class__应该帮助 '>>>富.__ class__ == datetime.date' 'FALSE' '>>>富.__ class__ == datetime.datetime' TRUE; – BernarditoLuis 2015-09-10 13:12:19

7

正确的做法是

import datetime 
isinstance(x, datetime.date) 

当我尝试这在我的机器上正常工作。你需要看看为什么datetime.date不是一个类。你可能用别的东西掩盖它吗?或者没有正确引用它来导入?

+0

问题中的示例显示这不起作用。你有解释吗? – 2013-04-22 16:01:34

+1

如果x是datetime.datetime,则cmd的解决方案也会返回True。这可能不是你想要或期望的。 Simon Steinberger的回答正确地区分了datetime.date和datetime.datetime。 – Chuck 2015-07-16 19:43:48

+0

@cmd在python 2.7中,语句“isinstance(datetime.datetime.now(),datetime.date)”返回True。 – Chuck 2017-04-10 13:49:34

3
import datetime 
d = datetime.date(2012, 9, 1) 
print type(d) is datetime.date 

> True 
+1

使用'is'而不是'=='是更习惯的方式:'print type(d)是datetime.date'。 – SpankMe 2013-04-22 16:00:48

+0

使用type()进行类型检查是不明智的,正确的方法是执行isinstance。 – 2014-12-21 20:39:12

+1

在这种情况下,type()对datetime.date和datetime.datetime都按预期工作。如果x是datetime.date或datetime.datetime,则isinstance(x,datetime.date)返回True。 – Chuck 2015-07-16 19:49:21

1

如果你现有的代码已经依靠from datetime import datetime,你也可以简单地也导入date

from datetime import datetime, timedelta, date 
print isinstance(datetime.today().date(), date) 
2

在Python 3.5,isinstance(x, date)作品我说:

>>> from datetime import date 
>>> x = date(2012, 9, 1) 
>>> type(x) 
<class 'datetime.date'> 
>>> isinstance(x, date) 
True 
>>> type(x) is date 
True 
相关问题