Java可暂停向上计时器问题:重启归零与小时显示异常修复
修复计时器的两个问题:暂停后重启重置、小时显示异常
问题1:重启计时器时从0开始计时
原因
原代码中重启时的startTime更新逻辑错误:startTime += (System.currentTimeMillis() - startTime) 实际等价于 startTime = System.currentTimeMillis(),完全覆盖了之前的起始时间,导致暂停前的计时进度丢失。
修复步骤
- 添加
long elapsedTime = 0变量,用于存储暂停时已经累计的计时时长 - 修改启动按钮的逻辑:
- 首次启动:记录当前时间为
startTime - 重启时:用当前时间减去已累计的
elapsedTime,得到新的startTime(这样计算出的时间差会包含之前的累计时长)
- 首次启动:记录当前时间为
- 修改暂停按钮的逻辑:暂停时计算从本次启动到暂停的时长,累加到
elapsedTime
问题2:小时数始终显示为07而非00
原因
- 使用了
KK格式符,这是12小时制的小时表示(范围01-12),不符合计时器需要的24小时制 SimpleDateFormat默认使用本地时区,而new Date(0)对应1970年1月1日00:00:00 UTC,本地时区偏移会导致显示时间偏离0点
修复步骤
- 将日期格式改为
HH:mm:ss(24小时制小时格式,范围00-23) - 给
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
相关产品推荐
相关产品推荐

