用JavaScript制作一个实时时钟

29
这个时钟有点能用。但是它不是替换当前的时间,而是每秒打印一个新的时间。我知道为什么会这样,但是不知道如何修复它。如果你能给我一些建议,而不是直接给出答案,我会非常感激。这是我的代码:
function time(){
    var d = new Date();
    var s = d.getSeconds();
    var m = d.getMinutes();
    var h = d.getHours();
    document.write(h + ":" + m + ":" + s);
}

setInterval(time,1000);

好的,document.write只是向文档添加内容,因此您将获得多行输出。您希望替换输出而不是继续添加它。 - VLAZ
如果将来有人遇到这个问题,如果你想让你的更新与系统时钟同步,我制作了一个小巧的软件包:https://github.com/pejalo/top-of-second-ticker - pejalo
18个回答

31

添加一个标签并更新其文本内容。

var span = document.getElementById('span');

function time() {
  var d = new Date();
  var s = d.getSeconds();
  var m = d.getMinutes();
  var h = d.getHours();
  span.textContent = 
    ("0" + h).substr(-2) + ":" + ("0" + m).substr(-2) + ":" + ("0" + s).substr(-2);
}

setInterval(time, 1000);
<span id="span"></span>

答案更新 [2022] https://dev59.com/AVkS5IYBdhLWcg3w05eT#67149791


1
谢谢!我甚至没有想到那个。本应该明白的。无论如何,谢谢! - WilliamG
@williamganrot:很高兴能帮助你。 - Pranav C Balan

21
您还可以在 Date() 上使用 toLocaleTimeString() 来仅获取您的显示日期,而不需要创建这么多变量。
window.onload = displayClock();
function displayClock(){
  var display = new Date().toLocaleTimeString();
  document.body.innerHTML = display;
  setTimeout(displayClock, 1000); 
}


9
在 setInterval 函数中使用 new Date().toLocaleTimeString()

setInterval(() => console.log(new Date().toLocaleTimeString()),1000);
 


5

以下是我的回答,希望能对你有所帮助。

<html>

<body>
  <script type="text/javascript" charset="utf-8">
    let a;
    let time;
    setInterval(() => {
      a = new Date();
      time = a.getHours() + ':' + a.getMinutes() + ':' + a.getSeconds();
      document.getElementById('time').innerHTML = time;
    }, 1000);
  </script>
  <span id="time"></span>
</body>

</html>

我使用了 setInterval 箭头函数,并声明了变量 a, time 在外部,以避免重复分配内存。这里的 标记在指定的间隔时间(这里是1000)运行,而 document.getElementById("time") 调用将获取指定ID的元素,并设置该元素的 innerHTML 值为 time 的值。


如果您能够在回答中解释一下您的代码解决了什么问题,而不只是发布一些代码,那将非常好。 - Klaassiek
2
我已经更新了我的答案并附上了解释,@Klaassiek,谢谢你,这是我第一次回答,不会再重复了。 - Naga Sai Sriya

3

请点击此链接https://codepen.io/uniqname/pen/eIApt,你将获得你想要的时钟或者尝试这段代码。

<!DOCTYPE html>
<html>
<head>
<script>
function startTime() {
    var today = new Date();
    var h = today.getHours();
    var m = today.getMinutes();
    var s = today.getSeconds();
    m = checkTime(m);
    s = checkTime(s);
    document.getElementById('txt').innerHTML =
    h + ":" + m + ":" + s;
    var t = setTimeout(startTime, 500);
}
function checkTime(i) {
    if (i < 10) {i = "0" + i};  // add zero in front of numbers < 10
    return i;
}
</script>
</head>

<body onload="startTime()">

<div id="txt"></div>

</body>
</html>

问题陈述为“如果你能给我一些提示,而不是直接给出答案”。 - Jan Turoň

2

这段代码将以数字格式显示时钟

function myClock() {         
  setTimeout(function() {   
    const d = new Date();
    const n = d.toLocaleTimeString();
    document.getElementById("demo").innerHTML = n; 
    myClock();             
  }, 1000)
}
myClock();    
<html>
    <body>
      <div id="demo"></div>
    </body>
</html>


以上代码将以数字格式显示时钟。 - w.Daya
请尽量详细解释答案。 - Tyler2P

1

<html>
<head>
  <script>
    function clock() {
      var clockDiv = document.querySelector("#clock");
      return setInterval(() => {
        let date = new Date();
        let tick = date.toLocaleTimeString();
        clockDiv.textContent = tick;
      }, 1000);
    }
  </script>
</head>
<body onload="clock()">
  <div id="clock"></div>
</body>
</html>


1

如果这是你的问题根源

但是它不会替换当前时间,而是每秒打印一个新的时间。

那么你无法使Date对象响应,因为

JavaScript日期对象以平台独立的格式表示单个时刻

如果您不希望每秒创建一个新对象,则可以注册专用Web worker,该工作程序每秒调用performance.now(),但这比仅创建Date对象更加耗费系统资源,后者只复制实际的系统时钟(因此不创建单独的进程来测量时间)。tl;dr: 就像您现在所做的那样,每秒创建一个新的Date对象。

你的document.write()问题的根源在于this:

因为document.write()会写入文档流,所以在已关闭(已加载)的文档上调用document.write() [在你的情况下是在setInterval中] 会自动调用document.open(),这将清除文档

要更新页面的一部分,通常可以像@Pranav建议的那样设置某个元素的innerHTML


1
这可以很好地使用ES6完成。

const clock12 = document.getElementById('clock12')
const clock24 = document.getElementById('clock24')

// Concatenate a zero to the left of every single digit time frame
function concatZero(timeFrame) {
  return timeFrame < 10 ? '0'.concat(timeFrame) : timeFrame
}

function realTime() {
  let date = new Date()
  let sec = date.getSeconds()
  let mon = date.getMinutes()
  let hr = date.getHours()
  // 12 hour time
  // If the hour equals 0 or 12, the remainder equals 0, so output 12 instead. (0 || 12 = 12)
  clock12.textContent = `${concatZero((hr % 12) || 12)} : ${concatZero(mon)} : ${concatZero(sec)} ${hr >= 12 ? 'PM' : 'AM'}`
  // 24 hour time
  clock24.textContent = `${concatZero(hr)} : ${concatZero(mon)} : ${concatZero(sec)}`
}

setInterval(realTime, 1000)
body,
html {
  height: 100%;
  display: grid;
}

div {
  margin: auto;
  font-size: 2rem;
  font-family: consolas;
}
<div>
  <p id="clock12"></p>
  <p id="clock24"></p>
</div>


上面的代码在午夜和凌晨1点之间不会出现AM/PM错误吗?它应该显示12:xx AM,但实际上会显示12:xx PM。 - Dan Christensen
上面的代码在午夜和凌晨1点之间不会出现上午/下午的错误吗?它应该显示12:xx AM,但实际上显示的是12:xx PM。 - undefined

1

setInterval(function () {
  const time = new Date().toTimeString().slice(0, 8);
  span.textContent = time
}, 1000)
<span id="span"></span>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接