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
相关产品推荐
相关产品推荐

