JavaScript 秒表 - 无法显示前导数字

JavaScript Stopwatch - Trouble Displaying a Leading Digit

我一直在尝试使用 JavaScript 创建一个简单的秒表脚本,以显示已经过去的秒数、分钟数和小时数。

理想情况下,我希望时间显示如下:

hh:mm:ss

使用 JavaScript,我无法找到一种内置的方法来格式化数字,以便在数字长度只有一位时它们包含前导零。这就是我的问题所在 - 我添加到脚本中以添加前导“0”的逻辑适用于 seconds 显示,但不适用于 minuteshours 显示。

我编写的代码不是只添加一个前导“0”然后是一个数字值,而是为 每个迭代 添加一个“0”setInterval() 函数,创建一长串“0”,然后是当前 minuteshours 值。

我无法理解为什么 minuteshours 部分会发生这种情况,但 不会 seconds 部分当使用的代码相同时。

理论上,我知道我基本上只是在字符串中添加另一个“0”,然后每次 setInterval() 函数执行时都会显示该字符串,但我似乎无法弄清楚为什么不会发生在 seconds 部分。同样有趣的是,前导“0”在计时器达到两秒后才开始添加。

请参阅下面我为此秒表脚本编写的代码。我当然会很感激任何人可以提供的任何见解,以使它按预期工作。

let seconds = 0;
let minutes = 0;
let hours = 0;

function stopWatch(){

//Increment seconds on each "tick" of the stopwatch
seconds++;

//Check if minutes or hours needs to be incremented (which should happen every 60 seconds or 60 minutes, resepctively)
if(seconds / 60 == 0){
 seconds = 0;
 minutes++;

 if(minutes / 60 == 0){
  minutes = 0;
  hours++;
 }

}

//If the number of elapsed seconds, minutes, or hours is less than 10, add a 0 to the front of the number.
if(seconds < 10){
 seconds = "0" + seconds;
}

if(minutes < 10){
 minutes = "0" + minutes;
}

if(hours < 10){
 hours = "0" + hours;
}

//Print the results to the "display" div in the HTML
document.getElementById("display").innerHTML = hours + ":" + minutes + ":" + seconds;

}

//Run the stopWatch() function every 1000ms
window.setInterval(stopWatch, 1000);
 <div id="display">00:00:00</div>

为了简单起见,我将 <script></script> 标记保留在 HTML 文档中,但是一旦我开始使用它,我可能会将脚本移动到它自己的 script.js 文件并可能添加一些按钮来启动、停止和重置秒表。

当您执行“0”+ 分钟(以及秒和小时)时,这些变量会自动转换为一个字符串,由两个字符、一个零和其他字符组成。

由于每次迭代都会携带变量,下次您将在字符串的开头添加另一个“0”字符,依此类推。

它没有发生在秒数上的原因是因为当你执行秒数++时,你在循环开始时将秒数 BACK 转换为 int。所以它变成了一个字符串,然后是一个int,然后是一个字符串,等等

要查看实际效果,请尝试以下代码段:

var test = 1;
console.log( typeof test );  //outputs "number"
test = "0" + test;
console.log( typeof test ); //outputs "string"
test++;
console.log( typeof test); //outputs number

我的建议是将计数单位与显示单位分开。查看分钟是否小于 10,如果是,则将 outputMinutes 设置为“0”+ 分钟。在几秒钟和几小时内做同样的事情。然后每次只更改 outputMinutes、outputSeconds 和 outputHours,而实际的分钟、秒和小时变量保持为整数。

let seconds = 0;
let minutes = 0;
let hours = 0;
let seconds_string = "0";
let minutes_string = "0";
let hours_string = "0";

function stopWatch(){

//Increment seconds on each "tick" of the stopwatch
seconds++;

//Check if minutes or hours needs to be incremented (which should happen every 60 seconds or 60 minutes, resepctively)
if(seconds / 60 === 1){
 seconds = 0;
 minutes++;

 if(minutes / 60 === 1){
  minutes = 0;
  hours++;
 }

}

//If the number of elapsed seconds, minutes, or hours is less than 10, add a 0 to the front of the number.
if(seconds < 10){
 seconds_string = "0" + seconds.toString();
} else {
    seconds_string = seconds.toString();
}

if(minutes < 10){
 minutes_string = "0" + minutes.toString();
} else {
    minutes_string = minutes.toString();
}

if(hours < 10){
 hours_string = "0" + hours.toString();
} else {
    hours_string = hours.toString();
}

//Print the results to the "display" div in the HTML
document.getElementById("display").innerHTML = hours_string + ":" + minutes_string + ":" + seconds_string;

}

//Run the stopWatch() function every 1000ms
window.setInterval(stopWatch, 1000);
 <div id="display">00:00:00</div>

不是在 if 中测试值是否小于 10,而是测试该值的长度作为字符串,如果它小于 2(这意味着在这种情况下任何小于 10 的数字),然后将另一个 "0" 作为字符串添加到该值;

如下所示:

let seconds = 0;
let minutes = 0;
let hours = 0;

function stopWatch(){
  seconds++;
  
  if(seconds / 60 == 0){
    seconds = 0;
    minutes++;
    if(minutes / 60 == 0){
      minutes = 0;
      hours++;
    }
  }

  if(seconds.toString().length < 2){
    seconds = "0" + seconds;
  }
  
  if(minutes.toString().length < 2){
    minutes = "0" + minutes;
  }

  if(hours.toString().length < 2){
    hours = "0" + hours;
  }
  document.getElementById("display").innerHTML = hours + ":" + minutes + ":" + seconds;
}

window.setInterval(stopWatch, 1000);
<div id="display">00:00:00</div>