You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome中Date.toLocaleString()为何未使用window.navigator.language?

问题描述

根据Date对象的官方文档,toLocaleString() 在未指定地区参数时应当使用浏览器默认locale,默认locale可以通过 navigator.language 查看。

当我的locale为"en-GB"时,预期输出日期格式为DD/MM/YYYY,实际却返回了MM/DD/YYYY(对应"en"或"en-US"格式)。如果我主动给方法指定"en-GB"作为locale参数,输出格式就符合预期。

为什么.toLocaleString()没有使用navigator.locale的值?

问题发布日期:2021年11月24日

相关测试代码:

window.navigator.language  // 是否为默认"locale"?
new Date().toString()
new Date().toLocaleDateString()  // 未使用window.navigator.language的值
new Date().toLocaleDateString("en-GB")  // 正常,使用了正确的格式

现象截图


问题解答

这个差异是浏览器对国际化API默认locale的取值逻辑和navigator.language的定义不一致导致的,核心原因有三个:

  1. 两者的定义本身就不一样
    navigator.language返回的是浏览器的UI界面语言,而toLocaleString这类国际化API使用的默认locale是「区域格式设置」,这两个配置在系统和浏览器里都是可以独立修改的。比如你可以把浏览器界面设为英文(英国),同时把日期、数字的格式设为美国格式,这种情况下navigator.language返回en-GB,但日期格式化还是会用en-US的规则。
  2. 浏览器的首选语言列表优先级逻辑
    大部分浏览器的国际化API取默认locale时,会优先读取你浏览器「首选语言列表」的第一个值,而不是浏览器界面的语言值。很多用户只是把浏览器界面改成了en-GB,但没有把「英语(英国)」拖到首选语言列表的第一位,列表第一位还是en或者en-US,自然就会返回不符合预期的格式。
  3. 部分浏览器的实现差异
    部分旧版Chromium内核浏览器存在已知的实现缺陷,就算首选语言列表第一位是en-GB,如果系统层面的区域格式没有设为英国,还是会fallback到en-US的日期格式。

解决方案

  • 先检查浏览器的首选语言列表,确认你需要的地区语言已经放在第一位;再检查系统的区域格式设置,和你的预期保持一致。
  • 生产环境永远主动给toLocaleString/toLocaleDateString传入指定的locale参数,不要依赖浏览器默认值。不同设备、不同浏览器的默认配置差异极大,主动传参是唯一能100%保证格式符合预期的方案。

内容的提问来源于stack exchange,提问作者Alex 75

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:54:03