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

discord.py开发抽奖功能时如何正确添加Unix时间戳

问题定位

代码存在2个核心错误导致时间显示异常,同时还有1个逻辑bug影响抽奖功能正常运行:

  • 时间换算逻辑错误:直接将天、小时、分钟、秒的输入数值相加作为总时长,没有按单位换算成统一的秒数,比如输入1天你只加了1,实际1天对应86400秒,算出来的总时长完全不对。
  • 时间戳格式错误:Discord支持的<t:xxx:R>格式要求传入目标时间点的UTC秒级Unix时间戳(即从1970年1月1日0点到目标时间的总秒数),你传入的是错误计算出的短时长数值,Discord会将其解析为1970年附近的时间,自然显示异常。
  • 流程逻辑错误:发送抽奖嵌入后没有等待抽奖时长结束,会立刻发送开奖通知,完全不符合抽奖流程。
正确实现代码

首先确保已经导入所需依赖:

import time
import asyncio
import discord

修复后的抽奖命令代码如下:

@client.command()
async def giveaway(ctx, days:int, hours:int, minutes:int, seconds:int, *, prize:str):
    # 统一将不同单位的输入时间换算为总秒数
    total_giveaway_seconds = days * 86400 + hours * 3600 + minutes * 60 + seconds
    # 计算开奖时刻的Unix时间戳:当前时间戳 + 抽奖总时长
    end_unix_timestamp = int(time.time()) + total_giveaway_seconds
    
    # 构造抽奖嵌入,同时显示剩余倒计时和精确开奖时间,和预期效果一致
    giveaway_embed = discord.Embed(
        title=prize,
        description=f"剩余开奖时间:<t:{end_unix_timestamp}:R>\n开奖时间:<t:{end_unix_timestamp}:F>"
    )
    await ctx.send(embed=giveaway_embed)
    
    # 等待抽奖时长结束
    await asyncio.sleep(total_giveaway_seconds)
    # 发送开奖通知
    end_embed = discord.Embed(
        title=f"抽奖已结束",
        description=f"恭喜中奖用户获得:{prize}"
    )
    await ctx.send(embed=end_embed)
修复点说明
  • 修正了时间换算逻辑,按单位倍率将天、小时、分钟换算为秒数后求和,得到准确的抽奖总时长
  • 基于当前系统时间的Unix时间戳计算开奖时刻的标准时间戳,Discord会自动根据查看用户的本地时区转换时间显示,自动更新倒计时,和预期效果完全一致
  • 新增asyncio.sleep()等待逻辑,抽奖时长走完后才发送开奖通知,修复原代码即时发开奖消息的问题
  • 在prize参数前添加*标识符,支持输入带空格的奖品名称,不会出现参数解析错误
  • 额外增加了精确开奖时间的显示,用户可以直接看到自己本地时区的具体开奖时点,体验更好

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:01:05