首页 > 解决方案 > 确定 datetime 对象是 date 还是 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/except 块也有问题:

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')

正确返回日期,但不是日期时间对象(返回 'datetime.datetime' 对象没有属性 'strfttime')

对不起,大脑转储,但我完全没有想法。

标签: pythondatetime

解决方案


如果您查看datetime该类的源代码(或简单地在 Mac 上使用 IDE 命令并单击datetime),您会注意到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)

推荐阅读