You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Telegram Bot开发:如何按两种不同日期格式排序字典?

解决Telegram Bot中多日期格式的字典排序问题

问题背景

开发Telegram Bot时,需要按日期对存储新闻的字典排序,以时间顺序输出新闻,但存在两种日期格式:

  • 短格式:%d.%m at %H:%M(无年份)
  • 长格式:%d.%m.%Y at %H:%M(含年份)

原代码仅支持长格式,无法兼容短格式;尝试用字符串长度判断适配的方案无效。

原代码(仅支持单格式)

from datetime import datetime as DT

for k,v in sorted(Dnews_dict.items(), key=lambda x: DT.strptime(x[1].get("time"),'%d.%m.%Y at %H:%M')):
    news = f"<b>{v['time']}</b>\n{hlink(v['title'],v['url'])}"
    await message.answer(news)

错误尝试的问题点

之前用固定字符串长度判断格式的方案存在多个问题:

  • 依赖未明确的round_data变量,逻辑模糊
  • 字符串长度不稳定:日期数字的位数(如1 vs 01)会改变字符串长度,无法用固定值判断
  • 代码中错误将at写成俄文в,导致格式匹配直接失败

正确解决方案

核心思路

编写一个通用日期解析函数,通过异常捕获尝试两种格式,对无年份的日期补充默认年份(如当前年份),确保排序逻辑可靠。

实现代码

1. 自定义日期解析函数

from datetime import datetime as DT

def parse_news_date(time_str):
    # 优先尝试带年份的格式
    try:
        return DT.strptime(time_str, '%d.%m.%Y at %H:%M')
    except ValueError:
        # 失败则尝试短格式,补充当前年份(可按需替换为固定年份)
        base_dt = DT.strptime(time_str, '%d.%m at %H:%M')
        return base_dt.replace(year=DT.now().year)

2. 使用解析函数排序并输出

# 按解析后的日期排序字典项
for k, v in sorted(Dnews_dict.items(), key=lambda x: parse_news_date(x[1].get("time"))):
    news = f"<b>{v['time']}</b>\n{hlink(v['title'], v['url'])}"
    # 指定parse_mode为HTML,确保加粗格式生效
    await message.answer(news, parse_mode='HTML')

方案优势

  • 不依赖字符串长度或字符计数,避免格式判断错误
  • 异常捕获机制能准确匹配两种格式,兼容性更强
  • 可灵活处理无年份的日期,保证排序的时间顺序正确性

内容的提问来源于stack exchange,提问作者Apple

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:20:41