使用quick.db实现24小时计时器时时间返回负数问题求助
24小时计时器返回负数问题解决方案
你代码中的时间差计算逻辑完全错误,是导致时间返回负数的根本原因。
问题拆解
日常24小时冷却计时器的核心逻辑是判断「当前时间」与「上次执行功能的时间」的差值是否超过24小时:
- 差值 >= 24小时:冷却结束,可执行功能,更新存储的时间为当前时间
- 差值 < 24小时:冷却中,剩余时间 = 24小时毫秒数 - 差值
你现有代码中的计算式timeout - (Date.now() * -2 - timer)展开后为timeout + 2*Date.now() + timer,完全不符合正常的时间差计算逻辑,你添加*-2只是碰巧凑出了表面上正常的数值,本质逻辑是错误的。
你移除*-2后得到负数,是因为此时计算式等价于(timer + timeout) - Date.now(),结果为负说明timer + timeout小于当前时间戳,即已经超过了24小时冷却期,本就不应该走冷却提示分支。
正确实现代码
const db = require('quick.db'); const ms = require('parse-ms'); const DAILY_TIMEOUT = 86400000; // 24小时对应的毫秒数 let lastUseTime = await db.fetch(`daily_timer`); if (lastUseTime !== null && Date.now() - lastUseTime < DAILY_TIMEOUT) { // 仍在冷却期,计算剩余时间 let remainingTime = ms(DAILY_TIMEOUT - (Date.now() - lastUseTime)); console.log(remainingTime); // 此处添加冷却提示逻辑 } else { // 冷却结束,执行对应功能 // 功能执行完成后更新数据库存储的时间为当前时间 await db.set(`daily_timer`, Date.now()); // 此处添加功能执行成功的逻辑 }
额外排查点
如果替换为正确逻辑后仍存在异常,先检查数据库中存储的daily_timer值是否为合法的13位Unix时间戳,确认存储时间戳的逻辑没有写错值类型、或误存为负数等异常值。
内容的提问来源于stack exchange,提问作者MrLlamaDev
相关产品推荐
相关产品推荐

