2013-04-22 238 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 
相關問題