首页 > 解决方案 > 获取 datetime.datetime(2019, 4, 24, 20, 40, 57) 作为值但需要转换为实际日期和时间

问题描述

我正在查询数据库,然后通过执行以下操作将结果传递给函数以进行元组到字典的转换:

 r = {}
 r = [dict((cursor.description[i][0], value)
    for i, value in enumerate(row)) for row in cursor.fetchall()]
 return r

这将返回一个字典列表,但我有两列创建了时间并更新了时间。我得到一个具有如下键/值的字典:

 {
 'recCreatedTimeUTC': datetime.datetime(2019, 4, 24, 20, 40, 57),
 'recUpdatedTimeUTC': datetime.datetime(2019, 4, 24, 20, 40, 57),
 'userID': 92
 }

我怎样才能让 datetime.datetime 正确显示日期?我无法通过 datetime.datetime 运行它,并将这些单词作为值的一部分而不引发错误,而且我不知道如何提取和转换我需要的内容并将其放回去。最终目标是将整个字典转换为字符串并在 API 调用中作为正文返回。

标签: python-3.xdatetime

解决方案


以您的输出为例:

MongoDB

如果您使用的是 MongoDB,您可以使用bsonpymongo 内置实用程序来帮助序列化 json: http ://api.mongodb.org/python/1.10.1/api/bson/json_util.html

示例用法(序列化):

from bson import json_util
import json

r = [{
    'recCreatedTimeUTC': datetime.datetime(2019, 4, 24, 20, 40, 57),
    'recUpdatedTimeUTC': datetime.datetime(2019, 4, 24, 20, 40, 57),
    'userID': 92
}]

json.dumps(r, default=json_util.default) 

输出:

[
  {
    "recCreatedTimeUTC": {
      "$date": 1556138457000
    },
    "recUpdatedTimeUTC": {
      "$date": 1556138457000
    },
    "userID": 92
  }
]

姜戈

如果您使用的是 Django,它会提供一个本机 DjangoJSONEncoder 序列化程序,可以正确处理日期时间对象。

请参阅https://docs.djangoproject.com/en/dev/topics/serialization/#djangojsonencoder

自定义默认值

如果您想为编码器使用自定义默认值,您可以这样做:

import datetime

import json

r = []
r = [{
    'recCreatedTimeUTC': datetime.datetime(2019, 4, 24, 20, 40, 57),
    'recUpdatedTimeUTC': datetime.datetime(2019, 4, 24, 20, 40, 57),
    'userID': 92
}]


def default(o):
    if isinstance(o, (datetime.date, datetime.datetime)):
        return o.isoformat()

print(json.dumps(r, indent=2, default=default))

输出:

[
  {
    "recCreatedTimeUTC": "2019-04-24T20:40:57",
    "recUpdatedTimeUTC": "2019-04-24T20:40:57",
    "userID": 92
  }
]

推荐阅读