用JavaScript做一个世界时钟

举报
静水流深-云海 发表于 2026/09/21 17:52:40 2026/09/21
【摘要】 纯前端世界时钟,同时显示多个城市当前时间,可增删城市。技术内核是 Intl.DateTimeFormat 的 timeZone 选项和 IANA 时区名,避开自己手写时差。

一、别手写时差,用 Intl 的 timeZone

最早我打算存"纽约 = 北京 -12 小时"自己减,结果夏令时期间变成 -13,全乱了。正确做法是用浏览器内置的 Intl.DateTimeFormat,它认识 IANA 时区名,夏令时自动处理:

function cityTime(tz, locale = 'zh-CN') {
  return new Intl.DateTimeFormat(locale, {
    timeZone: tz,
    hour: '2-digit', minute: '2-digit', second: '2-digit',
    hour12: false,
  }).format(new Date());
}
cityTime('America/New_York');  // "20:14:09"(自动按夏令时)
cityTime('Asia/Tokyo');        // "09:14:09"

timeZone 填的是像 Asia/Shanghai、Europe/London 这种 IANA 名,不是 "GMT+8"。后者不跟夏令时,前者跟。伦敦夏令时那几个月会自动从 GMT 切到 BST,Intl 替你搞定。

二、同时显示多个城市

城市列表存数组,渲染时逐个取时间。

let cities = [
  { name: '北京', tz: 'Asia/Shanghai' },
  { name: '纽约', tz: 'America/New_York' },
  { name: '伦敦', tz: 'Europe/London' },
  { name: '东京', tz: 'Asia/Tokyo' },
];
function render() {
  list.innerHTML = cities.map(c =>
    `<li>${c.name}:<b>${cityTime(c.tz)}</b></li>`
  ).join('');
}
setInterval(render, 1000);

三、增删城市

用户自己加城市,存的是 {name, tz}。时区名可以做成下拉(常见那十几个),避免手敲拼错。

image.png

四、常见时区对照

城市 IANA 时区 备注
北京 Asia/Shanghai 无夏令时
纽约 America/New_York 有夏令时
伦敦 Europe/London 有夏令时
东京 Asia/Tokyo 无夏令时
悉尼 Australia/Sydney 南半球,季节相反

小结

世界时钟别自己减时差——夏令时一变就错。用 Intl.DateTimeFormat 配 IANA 时区名(如 America/New_York),浏览器自动处理夏令时切换。多城市就是把 {name, tz} 数组逐个 format,每秒刷新一次。存城市用下拉选时区名,别让用户手敲,避免拼错。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。