Определите, является ли объект datetime датой или временем

#python #datetime

Вопрос:

Я пытаюсь отформатировать объекты datetime и написал небольшую функцию, чтобы определить, является ли объект datetime объектом даты или времени. Но ничего из того, что я пробовал, не работает.

Создание даты и времени с помощью datetime.date.today() и datetime.datetime.now() и присвоение этого значения dtDate.

Моей первой попыткой был isinstance() :

 dtDate = datetime.date.today()
# dtDate = datetime.datetime.now()

if isinstance(dtDate, date) :
        sDate = dtDate.strftime('%x')
    elif isinstance(dtDate, datetime) :
        sDate = dtDate.strfttime('%x %X')
 

Но это срабатывает независимо от того, дата это или время. Если я более конкретен, например, в «datetime.date» говорится, что «arg 2 должен быть типом или кортежем».

Я также попытался определить, есть ли у объекта поле «час» :

 if dtDate.hour :
    sDate = dtDate.strftime('%x %X')
else :
    sDate = dtDate.strfttime('%x')
 

Но это пугает, если объект является чисто датой, без атрибута «час».

Даже в блоке «попытка/исключение» есть проблемы :

 try :
    if dtDate.hour :
        sDate = dtDate.strftime('%x %X')
except :
    sDate = dtDate.strfttime('%x')
 

Это возвращает объект «datetime.date», у которого нет атрибута «strfttime» для объектов даты.

Наконец, я попытался сравнить типы :

 if type(dtDate) is datetime.date :
    sDate = dtDate.strftime('%x')
else :
    sDate = dtDate.strfttime('%x %X')
 

Возвращает правильно для объектов date, но не для объектов datetime (возвращает объект «datetime.datetime» без атрибута «strfttime»)

Извините за свалку мозгов, но у меня совершенно нет идей.

Комментарии:

1. Обратите внимание, что strfttime это опечатка: я не думаю, что это допустимый метод для любой даты/времени

2. По вашему зову isinstance , проходите datetime.date и datetime.datetime вместо этого. Вот в чем причина вашей ошибки.

Ответ №1:

Если вы посмотрите на исходный код datetime класса (или просто команду нажмите на datetime использование IDE на Mac), вы заметите, что datetime класс на самом деле является подклассом date :

 class datetime(date):
    ...
 

Следовательно, isinstance(dtDate, date) будет истинно, даже если dtDate это datetime объект.

Вы можете исправить это, сначала проверив более конкретный тип:

 if isinstance(dtDate, datetime):
    sDate = dtDate.strftime('%x %X')
elif isinstance(dtDate, date):
    sDate = dtDate.strftime('%x')
 

Полный код:

 from datetime import date, datetime

#  dtDate = date.today()
dtDate = datetime.now()

if isinstance(dtDate, datetime):
    sDate = dtDate.strftime('%x %X')
elif isinstance(dtDate, date):
    sDate = dtDate.strftime('%x')

print(sDate)
 

Комментарии:

1. КЛЯНУСЬ, я пытался это сделать. Ha. Спасибо — я рад, что решение простое. Большое спасибо!