如何计算任意两个Discord Snowflake/消息ID的时间差
解决方案
你遇到的跨频道无法获取消息的问题完全可以通过直接解析Discord雪花ID解决,不需要调用接口拉取消息实体。Discord所有公开ID都采用雪花算法生成,本身内嵌创建时间戳,解析后直接计算差值即可,不受频道、权限、消息归属场景限制。
Discord雪花ID时间解析逻辑如下:
- 雪花ID的时间基准为
2015-01-01 00:00:00 UTC,对应毫秒时间戳为1420070400000 - 取ID的整数值右移22位,得到的结果加上上述基准值,即为对应资源的创建毫秒时间戳
修改后可直接运行的完整代码
@bot.command(name='timedif', help='', aliases=['snowflake', 'timediff']) async def timedif(ctx, id1, id2): DISCORD_EPOCH = 1420070400000 try: id1 = int(id1) id2 = int(id2) except: await ctx.reply("Check your message ID's! They are incorrect!") return # 直接解析ID中的时间戳,无需拉取消息 ts1 = ((id1 >> 22) + DISCORD_EPOCH) / 1000 ts2 = ((id2 >> 22) + DISCORD_EPOCH) / 1000 secs = abs(ts2 - ts1) days,secs=divmod(secs,secs_per_day:=60*60*24) hrs,secs=divmod(secs,secs_per_hr:=60*60) mins,secs=divmod(secs,secs_per_min:=60) secs=round(secs, 2) answer='{} secs'.format(secs) if mins > 0: answer='{} mins and {} secs'.format(int(mins),secs) if hrs > 0: answer='{} hrs, {} mins and {} secs'.format(int(hrs),int(mins),secs) if days > 0: answer='{} days, {} hrs, {} mins and {} secs'.format(int(days),int(hrs),int(mins),secs) embed = discord.Embed(title="**Time Difference**", description=f"""IDs: {id1}, {id2} Time difference between the 2 IDs: {answer}""") await ctx.reply(embed=embed)
方案优势
- 无需任何API请求,响应速度更快,不会触发接口限流
- 无权限限制,支持跨服务器、跨频道、DM消息、甚至用户/频道/服务器等任意Discord资源ID的时间差计算
- 精度和拉取消息获取的
created_at完全一致,雪花ID的时间精度为毫秒级,足够满足保留两位小数秒的需求
内容的提问来源于stack exchange,提问作者J Muzhen
相关产品推荐
相关产品推荐

