Flask - 如何将 API 调用中的日期时间 JSON 数据转换为 "Last Seen X hours/minutes Ago"?

Flask - How to turn datetime JSON data from an API call into a "Last Seen X hours/minutes Ago"?

我正在使用 Flask,通过 API 调用我得到了日期时间 JSON 数据,我想将日期时间数据转换为“小时前”格式,但我不知道从哪里开始。

这是我从 API 调用中收到的数据:

{'first_seen': datetime.datetime(2014, 9, 12, 23, 50, 5, 989719),
 'last_seen': datetime.datetime(2020, 8, 19, 9, 35, 4, 417316)

例如,我希望 "last_seen" 翻译成“上次上线时间:3 小时前”或“上次上线时间:12 天前”。

原API调用:

    client = TwitchClient(app.config['TWITCH_CLIENT_ID'])
    users = client.users.translate_usernames_to_ids(streamer)

    streamers_page_list = []
    for user in users:
        streamer_channel_info = {
            'first_seen': user['created_at'],
            'last_seen': user['updated_at'],
            'name': user['display_name'],
            'bio': user['bio'],
            'logo': user['logo'],
            'id': user['id']
        }
        streamers_page_list.append(streamer_channel_info)

这实际上应该不会太难。由于您已经有一个 datetime 对象,您可以通过从当前日期时间减去 last_seen 日期时间来获得 timedelta 对象。

从这个 timedelta 对象中,您可以简单地获取具有代表性的天、秒或毫秒作为属性。

因此你基本上可以这样做:


delta = datetime.datetime.now() - last_seen
if delta.days > 0:
    print("{} days ago".format(delta.days))
else:
     print("{} hours ago".format(int(delta.seconds / 3600)))

从彼此中提取两个日期时间对象,将得到一个 timedelta 对象:

delta = datetime(2020, 8, 19, 9, 35, 4, 417316) - datetime(2014, 9, 12, 23, 50, 5, 989719)
delta
# output: 
# datetime.timedelta(days=2167, seconds=35098, microseconds=427597)

您可以像这样从 timedelta 对象中提取 days/seconds 差异:

delta.days 
delta.seconds

然后您可以根据需要重新格式化此信息。

最快最干净的方法是使用名为 humanize.

的库

直接从文档中提取示例:

>>> import humanize
>>> import datetime as dt
>>> humanize.naturalday(dt.datetime.now())
'today'
>>> humanize.naturaldelta(dt.timedelta(seconds=1001))
'16 minutes'
>>> humanize.naturalday(dt.datetime.now() - dt.timedelta(days=1))
'yesterday'
>>> humanize.naturalday(dt.date(2007, 6, 5))
'Jun 05'
>>> humanize.naturaldate(dt.date(2007, 6, 5))
'Jun 05 2007'
>>> humanize.naturaltime(dt.datetime.now() - dt.timedelta(seconds=1))
'a second ago'
>>> humanize.naturaltime(dt.datetime.now() - dt.timedelta(seconds=3600))
'an hour ago'

我认为这是最好的方法。将相应的日期时间提交到 humanize.naturaltime()humanize.naturalday(),您就可以开始了!