Discord机器人持久化命令冷却strptime运行报错排查
错误原因排查
你的测试代码存在3个明确问题,都会导致运行失败:
- 方法调用错误:
datetime.date类本身没有strptime方法,这个方法归属于datetime.datetime类,直接调用datetime.date.strptime()会抛出AttributeError。 - 格式符匹配风险:你用的
%y是匹配2位数字的年份(比如传入24-05-20会解析为2024年5月20日),如果你的数据库存的是4位年份格式(比如2024-05-20),会直接抛解析错误,这种场景要改用%Y格式符。 - 类型拼接错误:两个日期相减得到的是
datetime.timedelta对象,不能直接和字符串"days."做拼接,必须取对象的.days属性拿到整数类型的天数差,转成字符串后才能拼接发送。
修正后的测试代码
import datetime from discord.ext import commands @bot.command() async def datetest(ctx, date): today = datetime.date.today() print(today) # 注意:如果传入的日期是4位年份格式,把下面的%y改成%Y someday = datetime.datetime.strptime(date, "%y-%m-%d").date() diff = someday - today await ctx.send(f"{diff.days} days.")
正式冷却逻辑实现建议
- 数据库存储上次使用时间时,优先存UTC时区的
date或datetime类型字段,不要存字符串,避免后续解析出错、时区偏差导致冷却计算不准;读取时如果拿到的是原生日期类型对象,不需要额外做strptime解析,直接做日期差计算即可。 - 冷却判断逻辑直接取时间差的天数做判断:当
(当前日期 - 数据库存储的上次使用日期).days >=7时,才允许用户执行命令,执行后同步更新数据库里对应用户的上次使用日期为当前日期。 - 不要在冷却校验逻辑里硬编码依赖用户传入的日期参数,避免被恶意构造参数绕过校验。
内容的提问来源于stack exchange,提问作者Zaid Hussain
相关产品推荐
相关产品推荐

