【问题标题】:Using .toLocaleDateString() does not properly shorten month for "{month: 'short'}" if other options are included for de-DE locale如果 de-DE 语言环境包含其他选项,则使用 .toLocaleDateString() 不能正确缩短 "{month: 'short'}" 的月份
【发布时间】: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


【解决方案1】:

德国人[不要用 4 个或更少的字母缩写月份。他们可能会发现它们足够短,并尽量避免歧义。

https://web.library.yale.edu/cataloging/months

另请注意,九月不像许多其他语言那样是九月

还要注意你确实有一点,因为根据上面的链接,丹麦语(我的母语)也不会缩写为四个或更少,但在 JS 中它们会

所以我的解释是,仅一个月是 3 个字符,而日期是四个完整或更多缩写,即 4 个字母,包括句号。如果月份有四个或更少的字母,则没有句号。

德语 Jan./Jän。 2 月 März 4 月 Mai Juni Juli 8 月 9 月 Okt.十一月 Dez.
丹麦语 一月。二月集市 四月 少校 六月 七月 八月九月好的。十一月十二月。

const shortMonth = {
  month: 'short',
};
const shortMonthDay = {
  month: 'short',
  day: 'numeric'
};

for (let i = 0; i < 12; i++) {
  const today = new Date(Date.UTC(2021, i, 2, 0, 0, 0));
  console.log("German month",today.toLocaleDateString('de-DE', shortMonth))
  console.log("German month day",today.toLocaleDateString('de-DE', shortMonthDay))
  console.log("Danish month",today.toLocaleDateString('da-DK', shortMonth))
  console.log("Danish month day",today.toLocaleDateString('da-DK', shortMonthDay))
}

【讨论】:

  • 这是我的预期,但这并不能解释为什么,当仅格式化月份时,它会缩写为 3 个字母而不是 4。如果您检查代码的输出,您将看到 @987654323 @ 代表month: 'short'März 代表month: 'short', day: 'numeric'
  • 这似乎是制造商的选择:3 个字母自己,使用 4 个带或不带句号的字母
  • 我同意这似乎是它的实现方式。它是由一个土生土长的德国人引起我的注意的,所以它似乎没有遵循他们的期望——他们期望month 的格式一致,无论是否通过了其他选项。我会考虑将 3 个字符的缩写单独视为错误,因为语言环境不会缩写为 4 个字符的月份名称。感谢您的回复!现在是时候看看我可以在哪里调查这个上游......
  • 我发现基于语言标签的“本地化”整个概念存在致命缺陷。虽然某些种族群体通常以特定的语言和格式编写日期,但它们通常以多种格式发布,例如通常假定 en-GB 使用 d/m/y,但《泰晤士报》在其刊头日期上以“2021 年 6 月 4 日星期五”的格式写道,人们可能会认为它是 en-US。关键是每种语言没有明确的格式,当然也没有一种或多种文化共存的位置(区域)。
猜你喜欢
  • 1970-01-01
  • 2016-01-29
  • 2017-05-31
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多