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的定义不一致导致的,核心原因有三个:
- 两者的定义本身就不一样
navigator.language返回的是浏览器的UI界面语言,而toLocaleString这类国际化API使用的默认locale是「区域格式设置」,这两个配置在系统和浏览器里都是可以独立修改的。比如你可以把浏览器界面设为英文(英国),同时把日期、数字的格式设为美国格式,这种情况下navigator.language返回en-GB,但日期格式化还是会用en-US的规则。 - 浏览器的首选语言列表优先级逻辑
大部分浏览器的国际化API取默认locale时,会优先读取你浏览器「首选语言列表」的第一个值,而不是浏览器界面的语言值。很多用户只是把浏览器界面改成了en-GB,但没有把「英语(英国)」拖到首选语言列表的第一位,列表第一位还是en或者en-US,自然就会返回不符合预期的格式。 - 部分浏览器的实现差异
部分旧版Chromium内核浏览器存在已知的实现缺陷,就算首选语言列表第一位是en-GB,如果系统层面的区域格式没有设为英国,还是会fallback到en-US的日期格式。
解决方案
- 先检查浏览器的首选语言列表,确认你需要的地区语言已经放在第一位;再检查系统的区域格式设置,和你的预期保持一致。
- 生产环境永远主动给
toLocaleString/toLocaleDateString传入指定的locale参数,不要依赖浏览器默认值。不同设备、不同浏览器的默认配置差异极大,主动传参是唯一能100%保证格式符合预期的方案。
内容的提问来源于stack exchange,提问作者Alex 75
相关产品推荐
相关产品推荐

