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

Java实现当日23:59截止倒计时功能 现有代码问题咨询

问题核心与修正方案

原有代码的问题

  • 多次调用new Date()分别获取时、分、秒,可能出现两次调用间隔跨秒/跨分,导致时分秒不属于同一时间点,计算结果偏差
  • 当日剩余秒数的计算逻辑没有绑定统一的时间基准,若计算过程中跨天会出现负数结果
  • 等待时长计算逻辑冗余,容易出现数值错误

修正后代码

public String getCountdown(UUID uuid, Quest quest) {
    long questCompletedTimeMillis = plugin.getDatabaseManager().getQuestCompletedMillis(uuid, quest);
    // 任务未完成直接返回-1
    if (questCompletedTimeMillis == 0L) {
        return "-1";
    }
    long currentTimeMillis = System.currentTimeMillis();
    // 用Calendar统一计算当日23:59:59的毫秒时间戳,避免时区和时间点不匹配问题
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(currentTimeMillis);
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    calendar.set(Calendar.SECOND, 59);
    calendar.set(Calendar.MILLISECOND, 999);
    long endOfDayMillis = calendar.getTimeInMillis();
    // 剩余毫秒数
    long remainMillis = endOfDayMillis - currentTimeMillis;
    // 剩余时间不足直接返回-1
    if (remainMillis <= 0 || (questCompletedTimeMillis + remainMillis) < currentTimeMillis) {
        return "-1";
    }
    // 转换为时分秒
    long remainSeconds = remainMillis / 1000;
    long hours = remainSeconds / 3600;
    long minutes = (remainSeconds % 3600) / 60;
    long seconds = remainSeconds % 60;
    // 拼接字符串
    StringBuilder sb = new StringBuilder();
    if (hours > 0) {
        sb.append(hours).append("h ");
    }
    if (minutes > 0) {
        sb.append(minutes).append("m ");
    }
    if (seconds > 0 || sb.length() == 0) { // 避免只剩0秒时返回空
        sb.append(seconds).append("s");
    }
    return sb.toString().trim();
}

改动说明

  • 统一用Calendar计算当日结束时间戳,兼容系统时区,避免时间点不匹配问题
  • 简化剩余时长计算逻辑,直接用毫秒差值转换时分秒,降低出错概率
  • 补充边界判断,避免返回空字符串、负数时长等异常结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:45:03