怎样获取当前时间?

作者:袖梨 2026-06-27
new Date() 返回本地时区的当前时间对象,非字符串或时间戳;需调用 getXXX() 方法获取年月日等,toISOString() 得 ISO 字符串,toLocaleString() 等适配系统格式;实时更新用 setInterval() 并清理,关键逻辑须校准服务端时间。

new Date() 获取当前时间对象最直接

JavaScript 的 Date 构造函数不传参时,默认返回本地时区的当前时间戳对应的时间对象。这是所有后续格式化操作的基础,不是字符串也不是时间戳数字,而是一个可调用方法的对象。

常见错误是以为 new Date() 直接返回字符串,结果在拼接或比较时出错;也有人误用 Date.now()(它只返回毫秒数,没提供年月日等方法)。

  • 需要年、月、日、时、分、秒 → 调用 getFullYear()getMonth()getDate() 等方法
  • 需要 ISO 格式字符串(如 "2024-05-22T14:30:45.123Z")→ 用 toISOString()
  • 需要本地格式字符串(含时区)→ 用 toLocaleString(),注意不同系统/语言环境输出不同

toLocaleTimeString()toLocaleDateString() 控制显示粒度

这两个方法比手动拼接更可靠,能自动适配用户操作系统设置的语言和格式习惯。比如中文 Windows 默认显示“2024年5月22日”,而英文 macOS 显示 “May 22, 2024”。

容易踩的坑是忽略 options 参数:不传参时行为不可控;传空对象又可能触发默认 locale 的意外 fallback。

立即学习“前端免费学习笔记(深入)”;

  • 只要时间(不含日期)→ toLocaleTimeString('zh-CN', { hour12: false })
  • 只要日期(不含时间)→ toLocaleDateString('en-US', { year: 'numeric', month: '2-digit', day: '2-digit' })
  • 想固定为 24 小时制且带秒 → 必须显式写 hour12: falsesecond: '2-digit'

页面实时更新时间要用 setInterval(),但别用 setTimeout 递归模拟

每秒刷新一次显示,本质是定时读取并重写 DOM 内容。用 setInterval() 更简洁安全;用 setTimeout 递归虽然可行,但容易因执行延迟导致时间跳变或堆积。

性能影响很小,但要注意:频繁操作 DOM(尤其用 innerHTML)可能触发重排。如果只是更新一个 <span id="clock"></span>,直接改 textContent 就够了。

  • 启动定时器:const timer = setInterval(() => { clockEl.textContent = new Date().toLocaleTimeString(); }, 1000);
  • 页面卸载前记得清除:window.addEventListener('beforeunload', () => clearInterval(timer));
  • 不要在循环里反复创建 new Date() 对象再调方法——这没问题,开销可忽略;真正慢的是 DOM 写入

服务端时间不准?别依赖 new Date() 做逻辑判断

浏览器时间由用户设备决定,可能被手动修改、时区错设、系统休眠后未同步。如果你要做倒计时、权限过期、订单超时这类关键逻辑,new Date() 只能用于展示,不能用于计算是否过期。

真实场景中,必须和服务端时间对齐。常见做法是首次加载时请求一个 /api/time 接口,返回服务器当前 UNIX 时间戳(秒或毫秒),之后用这个基准 + 客户端经过的毫秒数来估算服务端当前时刻。

这个差值(client-server skew)通常几秒内,但跨设备、跨网络可能达分钟级。忽略它,就可能出现“用户看到时间还没到,但提交已提示过期”的问题。

相关文章

精彩推荐