Java时间戳用法咨询:基于Discord JDA与MongoDB实现背包计时功能

你提到的存储初始时间戳再计算时长的思路是完全可行的,也是这类定时生成资源类功能的主流实现方案,比每秒轮询更新数据库的方式性能高得多,完全适配你的JDA+MongoDB技术栈,具体实现逻辑可以参考下面的步骤:
数据结构设计(MongoDB用户文档示例)
{ "userId": "Discord用户唯一ID", "startTimestamp": null, // 触发start指令时的Unix时间戳(单位:毫秒,未启动时为null) "itemGenerateRate": 1, // 每秒生成的物品数量,可按需调整 "totalOwnedItems": 0, // 用户已经结算的总物品数 "maxGenerateHours": 24 // 可选:最多生成24小时物品,防止用户长期不领取导致数值溢出 }
指令处理逻辑
前缀 + start指令- 先查询对应用户的
startTimestamp字段,若不为空直接提示「背包已经在生成物品中,无需重复触发」 - 若为空,将当前系统时间戳写入
startTimestamp字段,更新数据库即可,不需要额外启动定时任务
- 先查询对应用户的
背包物品数计算逻辑
不需要实时更新数据库,每次需要读取背包数量时即时计算即可:// JDA中Java示例代码 long currentTime = System.currentTimeMillis(); long startTime = userDoc.getLong("startTimestamp"); long passedSeconds = (currentTime - startTime) / 1000; // 可选:超过最大生成时长的部分不计算 long maxSeconds = userDoc.getInteger("maxGenerateHours") * 3600; passedSeconds = Math.min(passedSeconds, maxSeconds); int backpackItems = (int) (passedSeconds * userDoc.getInteger("itemGenerateRate"));前缀 + collect指令- 查询对应用户的
startTimestamp字段,若为空直接提示「还未触发start指令,没有可结算的物品」 - 按照上面的公式计算出当前背包内的总物品数
- 将物品数累加到用户的
totalOwnedItems永久资产字段 - 将
startTimestamp重置为null,更新数据库 - 给用户返回结算成功提示,展示本次领取的物品数量即可
- 查询对应用户的
内容的提问来源于stack exchange,提问作者kaizen4
相关产品推荐
相关产品推荐

