如何在Discord.js中用毫秒生成相对时间戳实现冷却倒计时
Discord.js Revive指令冷却相对时间戳实现方案
需求说明
开发Discord.js的revive指令时,需要实现以下冷却提示逻辑:
- 指令无冷却时,回复
Wasn't on cooldown! - 指令处于冷却状态时,回复
Cooldown! (带冷却结束的相对时间戳),让用户直观知晓冷却结束时间,避免频繁刷指令
当前已完成冷却逻辑,但无法生成符合要求的Discord相对时间戳,使用依赖版本:Discord.js v13.10.2、quick.db v9.0.6、ms v2.1.3,Node.js 16.14.2
解决方法
Discord的相对时间戳采用固定格式 <t:Unix秒级时间戳:R>,核心是将冷却结束时间转换为秒级Unix时间戳(注意不是毫秒)。具体步骤:
- 从数据库获取冷却开始时间(
Date.now()存储的毫秒数) - 计算冷却结束时间:
冷却开始时间 + 冷却时长(毫秒) - 将结束时间转换为秒级Unix时间戳:
Math.floor(结束时间 / 1000) - 套入Discord相对时间戳格式,生成可显示的倒计时
修改后的核心代码
替换原代码中Main Code部分的内容:
// Main Code \\ let ReviveCooldown = 1.8e+6; // 30分钟对应的毫秒数 let cooldownDB = await db.get(`ReviveCooldown`); // 检查冷却是否有效(避免数据库无记录时出错) if (cooldownDB && ReviveCooldown - (Date.now() - cooldownDB) > 0) { // 计算冷却结束的毫秒时间 const cooldownEndTime = cooldownDB + ReviveCooldown; // 转换为秒级Unix时间戳 const unixTimestamp = Math.floor(cooldownEndTime / 1000); // 生成Discord相对时间戳 const relativeTimestamp = `<t:${unixTimestamp}:R>`; message.reply(`Cooldown! ${relativeTimestamp}`); } else { await db.set(`ReviveCooldown`, Date.now()); message.reply(`Wasn't on cooldown!`) }
注意事项
- 新增
cooldownDB &&判断,防止数据库未存储冷却记录时出现计算错误 - 无需依赖额外的
discord-timestamps包,直接使用Discord原生时间戳格式更稳定可靠
内容的提问来源于stack exchange,提问作者Hamoodi youtube
相关产品推荐
相关产品推荐

