114 votes

Python : comment vérifier si un objet est de type datetime.date ?

J'ai essayé quelques options évidentes mais aucune ne fonctionne :

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

Quelle est la bonne façon de procéder ?

161voto

olly_uk Points 3365

Je pense que la raison pour laquelle cela ne fonctionne pas dans votre exemple est que vous avez importé datetime comme ça :

from datetime import datetime

cela conduit à l'erreur que vous voyez

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

si vous importez simplement comme ceci :

import datetime

Le code s'exécutera comme indiqué dans toutes les autres réponses.

In [31]: import datetime

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

In [33]:

25voto

Andreu Gimenez Points 150

Dans Python 3.8.4, on peut vérifier que la méthode avec isinstance échouera lorsqu'il s'agira de vérifier si un datetime est de savoir si un date o un datetime car les deux chèques donneront True .

    >>> from datetime import datetime, date
    >>> mydatetime = datetime.now()
    >>> mydate = mydatetime.date()
    >>> isinstance(mydatetime, datetime)
    True
    >>> isinstance(mydatetime, date)
    True

Cela est dû au fait que datetime est une sous-classe de date comme il est expliqué dans cette autre réponse :

une instance d'une classe dérivée est aussi une instance d'une classe de base

Par conséquent, lorsqu'on fait la distinction entre datetime y date , type doit être utilisé à la place :

    >>> type(mydatetime) == date
    False
    >>> type(mydate) == date
    True
    >>> type(mydate) == datetime
    False
    >>> type(mydatetime) == datetime
    True

22voto

cmd Points 4592

Le bon chemin est

import datetime
isinstance(x, datetime.date)

Lorsque j'essaie cela sur ma machine, cela fonctionne bien. Vous devez chercher à savoir pourquoi datetime.date n'est pas une classe. Peut-être l'avez-vous masqué avec quelque chose d'autre ? ou ne l'avez-vous pas référencé correctement pour votre importation ?

18voto

Roman Kazakov Points 437

Selon documentation classe date est un parent de la classe datetime . Et isinstance() La méthode vous donnera True dans tous les cas. Si vous devez distinguer datetime de date vous devez vérifier le nom de la classe

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

J'ai été confronté à ce problème lorsque j'ai des règles de formatage différentes pour les dates et les dates avec l'heure.

17voto

Simon Steinberger Points 1787
import datetime
d = datetime.date(2012, 9, 1)
print type(d) is datetime.date

> True

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X