如何在Discord Bot中实时重置datetime.now以计算时间差?
解决Discord Bot时间差计算不实时的问题
核心问题是你把时间计算逻辑写在了全局代码里,机器人启动时就会一次性算出所有值并固定,后续触发指令时不会重新计算。要解决这个问题,只需要把时间相关的计算逻辑移到每个指令的处理代码内部,每次触发指令时再实时获取当前时间并计算。
修改后的完整代码
from datetime import datetime from dateutil.rrule import * @bot.event async def on_ready(): print("I'm in") @bot.event async def on_message(message): await bot.process_commands(message) if message.content.startswith('/Commands'): await message.channel.send('/Ben, /Competition, /Meets, /debug, /Code') # 合并大小写指令判断,实时计算剩余时间 if message.content.lower().startswith('/competition'): D0 = datetime.now() D1 = datetime(2023, 12, 2, 8, 0) delta = D1 - D0 days = int(delta.total_seconds() // 86400) hours = int((delta.total_seconds() // 3600) - days * 24) # 保留原业务逻辑的+6(如果是必要需求) hours += 6 await message.channel.send(f'{days} days and {hours} hours until our next competition.') if message.content.startswith('/Meets'): D0 = datetime.now() D1 = datetime(2023, 12, 2, 8, 0) number_weekdays = rrule(WEEKLY, byweekday=(MO,TU,TH,FR), dtstart=D0, until=D1).count() - 3 await message.channel.send(f'{number_weekdays} meets until next competition.') if message.content.startswith('/debug'): await message.channel.send('What are you Looking For?!') if message.content.startswith('/code'): D0 = datetime.now() D1 = datetime(2023, 12, 2, 8, 0) delta = D1 - D0 await message.channel.send(f'{delta}')
关键改动说明
- 将时间计算逻辑内联到指令处理中:每次用户触发相关指令时,才调用
datetime.now()获取当前最新时间,重新计算时间差和会议次数,确保结果实时更新。 - 修复了原代码的语法错误:原代码中
D0 = datetime.now缺少括号,正确写法是datetime.now()才能获取当前时间对象。 - 简化指令判断:用
content.lower()合并了大小写的/Competition指令判断,减少重复代码。 - 移除全局固定变量:不再在全局定义D0、delta等变量,避免启动后值被固定。
内容的提问来源于stack exchange,提问作者Will Abts
相关产品推荐
相关产品推荐

