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

Java可暂停向上计时器问题:重启归零与小时显示异常修复

修复计时器的两个问题:暂停后重启重置、小时显示异常

问题1:重启计时器时从0开始计时

原因

原代码中重启时的startTime更新逻辑错误:startTime += (System.currentTimeMillis() - startTime) 实际等价于 startTime = System.currentTimeMillis(),完全覆盖了之前的起始时间,导致暂停前的计时进度丢失。

修复步骤

  1. 添加long elapsedTime = 0变量,用于存储暂停时已经累计的计时时长
  2. 修改启动按钮的逻辑:
    • 首次启动:记录当前时间为startTime
    • 重启时:用当前时间减去已累计的elapsedTime,得到新的startTime(这样计算出的时间差会包含之前的累计时长)
  3. 修改暂停按钮的逻辑:暂停时计算从本次启动到暂停的时长,累加到elapsedTime

问题2:小时数始终显示为07而非00

原因

  1. 使用了KK格式符,这是12小时制的小时表示(范围01-12),不符合计时器需要的24小时制
  2. SimpleDateFormat默认使用本地时区,而new Date(0)对应1970年1月1日00:00:00 UTC,本地时区偏移会导致显示时间偏离0点

修复步骤

  1. 将日期格式改为HH:mm:ss(24小时制小时格式,范围00-23)
  2. 给SimpleDateFormat设置UTC时区,确保计时从00:00:00开始,不受本地时区影响

修改后的完整代码

// 修正日期格式与时区
private final SimpleDateFormat date = new SimpleDateFormat("HH:mm:ss");
private long startTime = 0;
private long elapsedTime = 0; // 新增:存储累计时长
private final ClockListener clock = new ClockListener();
private final Timer normalTimer = new Timer(53, clock);

public YourClassName() {
    // 设置UTC时区
    date.setTimeZone(TimeZone.getTimeZone("UTC"));
}
startTimerButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        if (startTime == 0) {
            // 首次启动
            startTime = System.currentTimeMillis();
        } else {
            // 重启:基于累计时长计算新的起始时间
            startTime = System.currentTimeMillis() - elapsedTime;
        }
        normalTimer.start();
    }
});

stopTimerButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        normalTimer.stop();
        // 暂停时计算本次启动到暂停的时长,累加到累计时长
        elapsedTime = System.currentTimeMillis() - startTime;
    }
});
private void updateClock(){
    // 计算当前已流逝的总时长
    long currentElapsed = System.currentTimeMillis() - startTime;
    Date elapsedDate = new Date(currentElapsed);
    timerText.setText(date.format(elapsedDate));
}
private class ClockListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        updateClock();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:50:22