求助:使用JavaScript在HTML中显示巴西实时时钟报错
帮你调试巴西时间显示的JS代码
嘿,我来帮你搞定这个问题!你遇到的TypeError: x.getMonth is not a function错误,原因很简单:你用new Date().toLocaleString(...)得到的x是一个字符串,而不是Date对象——字符串当然没有getMonth()这类Date专属方法啦😅。
问题出在哪?
原代码里这一行:
var x = new Date().toLocaleString("en-US", {timeZone: "America/Sao_Paulo"});
toLocaleString()会直接返回格式化好的时间字符串(比如"10/5/2024, 3:45:22 PM"),你之后试图用x.getMonth()去操作这个字符串,肯定会触发报错。
修复方案
我们需要先保留原始的Date对象,再从这个对象里提取巴西时区对应的年月日时分秒,最后自己拼接成想要的格式:
<head> <script> function display_c() { var refresh = 1000; // 刷新间隔(毫秒) mytime = setTimeout(display_ct, refresh); // 直接传函数引用,比字符串包裹更规范 } function display_ct() { // 1. 创建基础Date对象,后续基于它获取巴西时区的时间组件 var brDate = new Date(); // 2. 分别获取巴西时区的各时间部分,保证两位数格式 var month = brDate.toLocaleString("en-US", { timeZone: "America/Sao_Paulo", month: "2-digit" }); var day = brDate.toLocaleString("en-US", { timeZone: "America/Sao_Paulo", day: "2-digit" }); var year = brDate.toLocaleString("en-US", { timeZone: "America/Sao_Paulo", year: "numeric" }); var hours = brDate.toLocaleString("en-US", { timeZone: "America/Sao_Paulo", hour: "2-digit", hour12: false }); var minutes = brDate.toLocaleString("en-US", { timeZone: "America/Sao_Paulo", minute: "2-digit" }); var seconds = brDate.toLocaleString("en-US", { timeZone: "America/Sao_Paulo", second: "2-digit" }); // 3. 拼接成目标格式 var displayStr = `${month}/${day}/${year} - ${hours}:${minutes}:${seconds}`; document.getElementById('ct').innerHTML = displayStr; // 4. 设置下一次刷新 display_c(); } </script> </head> <body onload="display_ct();"> <span id='ct'></span> </body>
额外优化点
- 替换了过时的
getYear()方法,用toLocaleString获取完整年份,避免出现年份显示错误(比如2024年用getYear()会返回124) - 用
2-digit参数保证月份、日期、时分秒都是两位数格式(比如1月显示为01) - 去掉了函数调用的字符串包裹写法,避免潜在的作用域问题
- 用模板字符串拼接格式,可读性更强
现在运行这段代码,就能在任何访问位置都显示正确的巴西时间啦!
内容的提问来源于stack exchange,提问作者user8762292
相关产品推荐
相关产品推荐

