【问题标题】:Making a discord.py (rewrite version) timer based off of UTC time根据 UTC 时间制作 discord.py(重写版本)计时器
【发布时间】:2026-01-01 23:15:02
【问题描述】:

我想添加一个基于 UTC 时间的计时器来刷新我每天下载的 API 文件。我正在使用 Discord.py 的重写版本。这就是我在下面制作的方式:

@client.event
# Updates API files daily
async def clock_timer():
    from datetime import datetime
    import pytz

    datetime_utc = datetime.now(pytz.utc)

    await datetime_utc.strftime("%H:%M:%S") == "03:00:00"
    if datetime_utc.strftime("%H:%M:%S") == "03:00:00":
        processes.api_grabber()

我这样做对吗?

【问题讨论】:

    标签: python discord discord.py python-datetime pytz


    【解决方案1】:

    await datetime_utc.strftime("%H:%M:%S") == "03:00:00" 不是一个有效的语句,您需要做的是获取 time_delta 并一直休眠。

    datetime_utc = datetime.now(pytz.utc)
    three_am_tmr = datetime_utc.replace(hour=3, minute=0, second=0) + timedelta(days=1)
    delta = (three_am_tmr - datetime_utc).total_seconds()
    await asyncio.sleep(delta)
    #process api here
    

    但是,如果您希望计时器每天执行,您必须使用 discord.py 任务或类似APS的东西

    from discord.ext import tasks
    
    @tasks.loop(days=1)
    async def grab(something):
         #proccess api here
    
    
    @grab.before_loop()
    async def waiter():
       datetime_utc = datetime.now(pytz.utc)
       three_am_tmr = datetime_utc.replace(hour=3, minute=0, second=0) + 
       timedelta(days=1)
       delta = (three_am_tmr - datetime_utc).total_seconds()
       await asyncio.sleep(delta)
    
    #start task in a command
    

    参考资料:

    【讨论】:

      【解决方案2】:

      await 将“等待”直到事件发生,所以 if 语句应该没用。如果您正在导入的模块将在程序运行时始终使用,请将它们导入文件的顶部,而不是函数内部。

      【讨论】: