#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. Спасибо — я рад, что решение простое. Большое спасибо!