【发布时间】:2021-06-04 18:53:09
【问题描述】:
仅在选项中传递“月”选项时,德语中的缩短值正确返回。尝试格式化“日”会改变“月”值的返回方式。此问题在 en-US 语言环境中不存在,但在 de-DE 中存在。
我不是要求解决此行为 - 手动格式化字符串、覆盖月份或使用日期时间库都是可能的解决方案,并且都非常容易实现。我对为什么会发生这种情况很感兴趣。
这种行为在 Chrome、Firefox 和 Node 中始终存在。
将月份更改为一月(德语:Januar)正确地将月份缩短为三个字符:Jan 在两种语言环境中。将带有 4 个字母名称的月份(May、June、July)传递给 onlyMonthOption 会返回 3 个字符的字符串,而将它们传递给 buggedOption 会返回完整的 4 个字符的字符串,而人们会期望得到 3 个字符的字符串。
我认为 month: 'short' 不应该返回两个不同的值,具体取决于是否包含其他选项。这似乎是一个可能的实现错误。
const today = new Date(Date.UTC(2021, 5, 2, 0, 0, 0));
const onlyMonthOption = { month: 'short' };
const buggedOption = { month: 'short', day: 'numeric' };
//de-DE behaves unexpectedly
console.log(today.toLocaleDateString('de-DE', onlyMonthOption)); // Properly returns "Jun"
console.log(today.toLocaleDateString('de-DE', buggedOption)) // Improperly returns "Juni", expected "Jun"
//en-US works as expected
console.log(today.toLocaleDateString('en-US', onlyMonthOption)); // Properly returns "Jun"
console.log(today.toLocaleDateString('en-US', buggedOption)) // Propery returns "Jun"
【问题讨论】:
-
请注意,toLocale* 方法依赖于实现,并且基于开发人员对来自CLDR project 的信息的解释。它不是标准化的,也没有任何确定性。你最好手动格式化日期,图书馆可以提供帮助,但不是必需的。
标签: javascript datetime internationalization