You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

Discord Bot

你提到的存储初始时间戳再计算时长的思路是完全可行的,也是这类定时生成资源类功能的主流实现方案,比每秒轮询更新数据库的方式性能高得多,完全适配你的JDA+MongoDB技术栈,具体实现逻辑可以参考下面的步骤:

数据结构设计(MongoDB用户文档示例)

{
  "userId": "Discord用户唯一ID",
  "startTimestamp": null, // 触发start指令时的Unix时间戳(单位:毫秒,未启动时为null)
  "itemGenerateRate": 1, // 每秒生成的物品数量,可按需调整
  "totalOwnedItems": 0, // 用户已经结算的总物品数
  "maxGenerateHours": 24 // 可选:最多生成24小时物品,防止用户长期不领取导致数值溢出
}

指令处理逻辑

  • 前缀 + start指令

    1. 先查询对应用户的startTimestamp字段,若不为空直接提示「背包已经在生成物品中,无需重复触发」
    2. 若为空,将当前系统时间戳写入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指令

    1. 查询对应用户的startTimestamp字段,若为空直接提示「还未触发start指令,没有可结算的物品」
    2. 按照上面的公式计算出当前背包内的总物品数
    3. 将物品数累加到用户的totalOwnedItems永久资产字段
    4. 将startTimestamp重置为null,更新数据库
    5. 给用户返回结算成功提示,展示本次领取的物品数量即可

内容的提问来源于stack exchange,提问作者kaizen4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:15:04