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变量,逻辑模糊 - 字符串长度不稳定:日期数字的位数(如
1vs01)会改变字符串长度,无法用固定值判断 - 代码中错误将
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
相关产品推荐
相关产品推荐

