Python ISO datetime包含'T'字符

el_*_*_le 3 python datetime json

如何让这个lambda获得一个不包含T时间戳的时间戳?

@app.route("/bookings", methods=['GET'])
def bookings():
    bookings = Booking.query.all()
    dictList = []
    for b in bookings:
        dictList.append(b.as_dict())
    dthandler = lambda obj: (
                    obj.isoformat()
                    if isinstance(obj, datetime.datetime)
                    or isinstance(obj, datetime.date)
                    else None)
    return json.dumps(dictList, default=dthandler)
Run Code Online (Sandbox Code Playgroud)

例如时间戳:

2015-04-11T01:30:00
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

datetime.isoformat()函数接受一个参数:要使用的分隔符.'T'如果省略则默认为; 如果你想要别的东西,那么转而通过:

obj.isoformat(' ')
Run Code Online (Sandbox Code Playgroud)

引用文档:

可选参数sep(默认值'T')是一个单字符分隔符,位于结果的日期和时间部分之间.

您也可以在此处将对象转换为字符串; datetime.__str__()与...基本相同datetime.isoformat(' ').

演示:

>>> from datetime import datetime
>>> obj = datetime(2015, 4, 21, 20, 0, 0)
>>> obj.isoformat()
'2015-04-21T20:00:00'
>>> obj.isoformat(' ')
'2015-04-21 20:00:00'
Run Code Online (Sandbox Code Playgroud)

只有datetime.isoformat()方法才能使用该参数; date.isoformat()才不是; 你必须调整你的default处理程序来区分datedatetime对象以使其工作,或者只是使用str():

dthandler = lambda obj: (
                obj.isoformat(' ') if isinstance(obj, datetime.datetime)
                else obj.isoformat() if isinstance(obj, datetime.date)
                else None)
Run Code Online (Sandbox Code Playgroud)

要么

dthandler = lambda obj: (
                str(obj) if isinstance(obj, (datetime.datetime, datetime.date))
                else None)
Run Code Online (Sandbox Code Playgroud)