直接用 date 对象配合定时更新即可实现,推荐 setinterval 每秒调用一次并立即执行,使用 textcontent 写入、padstart 补零、tolocaletimestring 适配本地格式,注意 getmonth() 和 getday() 的索引偏移及客户端时间不可信问题。

直接用 Date 对象配合定时更新就能实现,不需要引入任何库。关键不是“能不能做”,而是选哪种方式更稳、更少出错、更贴合实际场景。
用 setInterval 每秒更新最简单但要注意 DOM 写入方式
这是新手最常写的方案:定义一个函数获取 new Date(),格式化后写进元素。但容易忽略两点:
- 用
innerHTML而非textContent—— 如果时间字符串里意外混入或引号,可能触发 HTML 解析甚至 XSS(哪怕概率低) - 没等 DOM 加载完就执行脚本 —— 把
<script></script>放在底部,或包装在DOMContentLoaded事件里 - 月份和日期要手动加 1 和补零:
getMonth()返回 0–11,getDate()不补零,直接拼接会出 “2026-8-26 10:47:3” 这种格式
推荐写法示例:
function updateClock() {
const d = new Date();
const h = String(d.getHours()).padStart(2, '0');
const m = String(d.getMinutes()).padStart(2, '0');
const s = String(d.getSeconds()).padStart(2, '0');
document.getElementById('clock').textContent = `${h}:${m}:${s}`;
}
setInterval(updateClock, 1000);
updateClock(); // 立即执行一次,避免首次显示空白
用 requestAnimationFrame 更准,但别盲目替换 setInterval
它本质是“浏览器重绘前调用”,适合动画类高频更新;但对秒级时间显示,优势有限,反而容易踩坑:
- 它不保证每秒刚好执行一次 —— 如果页面标签页被切走、设备休眠或主线程卡住,回调可能延迟甚至跳过
- 若只靠
requestAnimationFrame更新,时间可能“粘滞”一秒以上,用户明显感知到跳秒 - 真正实用的做法是:用
setInterval做兜底更新(比如每 500ms),再用requestAnimationFrame在帧内微调显示(仅当秒数真变了才写 DOM)
纯 requestAnimationFrame 示例(仅作参考,不推荐单独使用):
function tick() {
const now = new Date();
const sec = now.getSeconds();
if (sec !== lastSec) {
document.getElementById('clock').textContent = now.toLocaleTimeString();
lastSec = sec;
}
requestAnimationFrame(tick);
}
let lastSec = -1;
tick();
用 toLocaleTimeString() 快速适配本地习惯,但别依赖它做计算
这个方法省去手动拼接逻辑,自动按系统语言输出 “10:47:32” 或 “上午10:47:32”,适合纯展示场景:
- 传参
{ hour12: false }可强制 24 小时制,避免中文环境默认 AM/PM - 它返回的是字符串,不能反向解析成
Date对象 —— 如果后续要算“距离下班还有多久”,得另起一个new Date()实例 - 不同浏览器对 locale 支持略有差异,比如 Safari 对
zh-CN的格式细节可能和 Chrome 不一致
安全用法:
const timeStr = new Date().toLocaleTimeString('zh-CN', {
hour12: false,
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
});
document.getElementById('clock').textContent = timeStr;
显示完整日期+星期时,getDay() 和 getMonth() 的索引偏移必须处理
很多人卡在这一步:想显示 “2026年8月26日 星期三”,结果月份是 7、星期是 3。因为:
-
getMonth()返回 0–11,所以 8 月对应值是7,必须 +1 -
getDay()返回 0–6(周日=0,周一=1…周六=6),星期三对应3,需映射到中文数组['星期日','星期一',...] - 直接用
toDateString()得到的是英文(如 "Tue Aug 26 2026"),不能直接用于中文页面
简明映射写法:
const weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
const months = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'];
const d = new Date();
const dateStr = `${d.getFullYear()}年${months[d.getMonth()]}${d.getDate()}日 ${weekdays[d.getDay()]}`;
最易被忽略的点:时间显示依赖客户端系统时间,如果用户手动改了本地时间,页面时间就不可信。需要高精度或跨设备对齐的场景(如倒计时、日志时间戳),必须从服务端注入初始时间,并用客户端时间差做校准。单纯展示“现在几点”,Date 就够用,但别把它当权威时钟用。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











