Python: how can I check whether an object is of type datetime.date?

后端 未结 7 1090
既然无缘
既然无缘 2020-12-24 10:16

I have tried a few obvious options but none of them works:

In [150]: x
Out[150]: datetime.date(2012, 9, 1)

In [151]: type(x)
Out[151]: datetime.date

In [15         


        
相关标签:
7条回答
  • 2020-12-24 10:46
    import datetime
    d = datetime.date(2012, 9, 1)
    print type(d) is datetime.date
    
    > True
    
    0 讨论(0)
  • 2020-12-24 10:50

    If you are using freezegun package in tests you may need to have more smart isinstance checks which works well with FakeDate and original Date/Datetime beeing inside with freeze_time context:

    def isinstance_date(value):
        """Safe replacement for isinstance date which works smoothly also with Mocked freezetime"""
        import datetime
        if isinstance(value, datetime.date) and not isinstance(value, datetime.datetime):
            return True
        elif type(datetime.datetime.today().date()) == type(value):
            return True
        else:
            return False
    
    
    def isinstance_datetime(value):
        """Safe replacement for isinstance datetime which works smoothly also with Mocked freezetime """
        import datetime
        if isinstance(value, datetime.datetime):
            return True
        elif type(datetime.datetime.now()) == type(value):
            return True
        else:
            return False
    
    

    and tests to verify the implementation

    class TestDateUtils(TestCase):
    
        def setUp(self):
            self.date_orig = datetime.date(2000, 10, 10)
            self.datetime_orig = datetime.datetime(2000, 10, 10)
    
            with freeze_time('2001-01-01'):
                self.date_freezed = datetime.date(2002, 10, 10)
                self.datetime_freezed = datetime.datetime(2002, 10, 10)
    
        def test_isinstance_date(self):
            def check():
                self.assertTrue(isinstance_date(self.date_orig))
                self.assertTrue(isinstance_date(self.date_freezed))
                self.assertFalse(isinstance_date(self.datetime_orig))
                self.assertFalse(isinstance_date(self.datetime_freezed))
                self.assertFalse(isinstance_date(None))
    
            check()
            with freeze_time('2005-01-01'):
                check()
    
        def test_isinstance_datetime(self):
            def check():
                self.assertFalse(isinstance_datetime(self.date_orig))
                self.assertFalse(isinstance_datetime(self.date_freezed))
                self.assertTrue(isinstance_datetime(self.datetime_orig))
                self.assertTrue(isinstance_datetime(self.datetime_freezed))
                self.assertFalse(isinstance_datetime(None))
    
            check()
            with freeze_time('2005-01-01'):
                check()
    
    
    0 讨论(0)
  • 2020-12-24 10:51

    According to documentation class date is a parent for class datetime. And isinstance() method will give you True in all cases. If you need to distinguish datetime from date you should check name of the class

    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
    

    I've faced with this problem when i have different formatting rules for dates and dates with time

    0 讨论(0)
  • 2020-12-24 10:52

    In Python 3.5, isinstance(x, date) works to me:

    >>> from datetime import date
    >>> x = date(2012, 9, 1)
    >>> type(x)
    <class 'datetime.date'>
    >>> isinstance(x, date)
    True
    >>> type(x) is date
    True
    
    0 讨论(0)
  • 2020-12-24 10:54

    right way is

    import datetime
    isinstance(x, datetime.date)
    

    When I try this on my machine it works fine. You need to look into why datetime.date is not a class. Are you perhaps masking it with something else? or not referencing it correctly for your import?

    0 讨论(0)
  • 2020-12-24 11:06

    If your existing code is already relying on from datetime import datetime, you can also simply also import date

    from datetime import datetime, timedelta, date
    print isinstance(datetime.today().date(), date)
    
    0 讨论(0)
提交回复
热议问题