JavaScript中toLocaleString()返回错误月份的技术求助
问题分析与快速修复
嘿,这个问题我太熟了——这是JavaScript Date构造函数里一个非常经典的“反直觉”设计坑!
你遇到的月份超前问题,核心原因是:JavaScript的Date构造函数里,月份参数是从0开始计数的——0对应1月,1对应2月,……,11对应12月。你代码里写的new Date(2018,4,3,21,0)里的4,其实对应的是5月,而不是你预期的4月,这就导致本地化后的月份显示多了一个月。
直接修复代码
只需要把月份参数减1,改成3就能得到你想要的4月:
<!DOCTYPE html> <html> <body> <p id="demo"></p> <script> var d = new Date(2018,3,3,21,0); // 这里把4改成3 document.getElementById("demo").innerHTML = d.toLocaleString('de-DE'); </script> </body> </html>
运行这段代码后,就会输出你预期的3.4.2018, 21:00:00。
额外说明
- 为什么用
Date.now()时显示正常?因为Date.now()返回的是当前时间的时间戳,会被自动解析成正确的实际日期,不需要手动传入月份参数,自然不会踩这个0-based的坑。 - 如果你担心以后再忘这个规则,也可以用更直观的方法来构建日期,避免构造函数参数顺序混淆:
这样分步设置的逻辑更清晰,也能减少出错概率。var d = new Date(); d.setFullYear(2018); d.setMonth(3); // 注意:setMonth的参数同样是0-based,3对应4月 d.setDate(3); d.setHours(21); d.setMinutes(0);
内容的提问来源于stack exchange,提问作者Moonbase
相关产品推荐
相关产品推荐

