获取Discord.js机器人在线时长:24小时格式实现方案问询
精简实现Discord机器人在线时长查询命令
嘿,刚好我之前做Discord机器人时折腾过这个功能,给你分享个最精简又靠谱的实现方案,完全不需要花里胡哨的依赖,用原生工具就能搞定!
核心思路
其实Discord.js(我默认你用的是这个最流行的库)已经帮我们内置了机器人在线时长的统计——客户端实例的uptime属性,它会返回机器人从启动到当前的毫秒数。我们要做的只是把这个数字转换成用户友好的24小时格式(比如02:15:45或者01:02:15:45,前者是不到一天的时长,后者是1天2小时15分45秒)。
完整代码实现
1. 格式化函数(通用,可复用)
先写一个精简的格式化函数,把毫秒数转成补零的时分秒/天时分秒格式:
const formatUptime = (ms) => { const days = Math.floor(ms / 86400000); const hours = Math.floor((ms % 86400000) / 3600000); const minutes = Math.floor((ms % 3600000) / 60000); const seconds = Math.floor((ms % 60000) / 1000); // 自动过滤掉不需要的天数(如果在线不到一天就不显示),所有数字补零到两位 return [ days > 0 ? days.toString().padStart(2, '0') : null, hours.toString().padStart(2, '0'), minutes.toString().padStart(2, '0'), seconds.toString().padStart(2, '0') ].filter(Boolean).join(':'); };
2. Slash命令实现(Discord.js v14)
现在把这个函数用到斜杠命令里,这也是目前Discord推荐的命令形式:
import { SlashCommandBuilder } from 'discord.js'; export default { data: new SlashCommandBuilder() .setName('uptime') .setDescription('查询机器人的在线时长'), async execute(interaction) { // 直接用客户端内置的uptime属性,不用自己记录启动时间! const formattedUptime = formatUptime(interaction.client.uptime); await interaction.reply(`我已经在线 **${formattedUptime}** 啦 🎉`); }, };
3. 前缀命令实现(兼容旧版习惯)
如果你还需要支持!uptime这类前缀命令,代码也很简单:
// 放在机器人启动后的消息监听逻辑里 client.on('messageCreate', (message) => { // 过滤机器人自己的消息和无关命令 if (message.author.bot || !message.content.startsWith('!uptime')) return; const formattedUptime = formatUptime(client.uptime); message.reply(`当前在线时长:**${formattedUptime}**`); });
为什么这个实现最优?
- 零额外维护:不用手动记录启动时间,Discord.js会自动帮我们维护
uptime属性,避免自己存时间戳可能出现的误差 - 无外部依赖:全程只用原生JavaScript和Discord.js内置API,代码轻量且稳定
- 格式规范:自动补零保证24小时格式的一致性,比如
09小时而不是9,看起来更专业 - 灵活适配:自动根据在线时长决定是否显示天数,短时长显示
时:分:秒,长时长显示天:时:分:秒,用户体验更好
内容的提问来源于stack exchange,提问作者Persik
相关产品推荐
相关产品推荐

