【问题标题】:How can I determine if week starts on Monday or Sunday based on locale in pure Javascript?如何根据纯 Javascript 中的语言环境确定一周是从星期一还是星期日开始?
【发布时间】:2019-04-22 06:36:19
【问题描述】:

嗯,这个标题很容易解释 - 我需要用纯 Javascript 计算出星期几以本地开始 - 可以是星期一、星期日、星期六或星期五。

我找到了这个https://stackoverflow.com/a/727536/1226226

<firstDay day="mon" territories="001 AD AI AL AM AN AT AX AZ BA BE BG BM BN BY CH CL CM CR CY CZ DE DK EC EE ES FI FJ FO FR GB GE GF GP GR HR HU IS IT KG KZ LB LI LK LT LU LV MC MD ME MK MN MQ MY NL NO PL PT RE RO RS RU SE SI SK SM TJ TM TR UA UY UZ VA VN XK" />
<firstDay day="fri" territories="BD MV" />
<firstDay day="sat" territories="AE AF BH DJ DZ EG IQ IR JO KW LY MA OM QA SD SY" />
<firstDay day="sun" territories="AG AR AS AU BR BS BT BW BZ CA CN CO DM DO ET GT GU HK HN ID IE IL IN JM JP KE KH KR LA MH MM MO MT MX MZ NI NP NZ PA PE PH PK PR PY SA SG SV TH TN TT TW UM US VE VI WS YE ZA ZW" />
<firstDay day="sun" territories="GB" alt="variant" references="Shorter Oxford Dictionary (5th edition, 2002)" />

找到一个兼容的 ISO3166 和 ISO639 代码表 - https://wiki.openstreetmap.org/wiki/Nominatim/Country_Codes

【问题讨论】:

标签: javascript date weekday


【解决方案1】:

没有一刻。本质上是https://github.com/gamtiq/weekstart 的重度高尔夫版本,忽略了一些不寻常的语言环境。没有任何纯 JS 答案(使用 2020 年可用的 API)是完美的,但这将产生与至少 99.9% 的用户使用系统 API 相同的结果。

https://github.com/tc39/proposal-intl-locale-info 已被提议,其中将为此提供 API 级解决方案。

function weekStart(region, language) {
  const regionSat = 'AEAFBHDJDZEGIQIRJOKWLYOMQASDSY'.match(/../g);
  const regionSun = 'AGARASAUBDBRBSBTBWBZCACNCODMDOETGTGUHKHNIDILINJMJPKEKHKRLAMHMMMOMTMXMZNINPPAPEPHPKPRPTPYSASGSVTHTTTWUMUSVEVIWSYEZAZW'.match(/../g);
  const languageSat = ['ar','arq','arz','fa'];
  const languageSun = 'amasbndzengnguhehiidjajvkmknkolomhmlmrmtmyneomorpapssdsmsnsutatethtnurzhzu'.match(/../g);

  return (
    region ? (
      regionSun.includes(region) ? 'sun' :
      regionSat.includes(region) ? 'sat' : 'mon') : (
      languageSun.includes(language) ? 'sun' :
      languageSat.includes(language) ? 'sat' : 'mon'));
}

function weekStartLocale(locale) {
  const parts = locale.match(/^([a-z]{2,3})(?:-([a-z]{3})(?=$|-))?(?:-([a-z]{4})(?=$|-))?(?:-([a-z]{2}|\d{3})(?=$|-))?/i);
  return weekStart(parts[4], parts[1]);
}

console.log(weekStartLocale(navigator.language));
console.log(weekStartLocale('en'));
console.log(weekStartLocale('en-GB'));
console.log(weekStartLocale('ar-AE'));

【讨论】:

  • 令人印象深刻的打高尔夫球通常意味着要加载大量数据。我很好奇这有多完整,你认为它是否可以生成?
  • @Semicolon 我丢失了指向我从中派生的 JSON 数据库的链接。 github.com/gamtiq/weekstart 现在是更完整的解决方案;我可以打这个球,然后在这里发布结果。
  • 谢谢。我要补充一点,这里的语言标签的正则表达式不太正确——例如,不会有下划线——尽管这些差异(在实践中几乎不重要)可能正在解决某些代理中的已知问题。这就是我最终使用的,来自您的回答:gist.github.com/bathos/84286d0d6052d10dd98a444d41e9db43 再次感谢 - 我会查看该链接!
  • @Semicolon 没有用户代理应该发送下划线作为分隔符:tools.ietf.org/html/bcp47
  • @Semicolon 终于找到了更好的答案。
【解决方案2】:

你可以使用 moment.js

moment.localeData('en-us').firstDayOfWeek();

对于纯 js,你必须自己制作查找表。 您可以使用 momentjs 源代码作为参考。 https://github.com/moment/moment/tree/develop/locale

在每个语言环境文件中查找配置末尾的dow

【讨论】:

  • 我希望可以,但我不能使用任何 3rd 方库
  • 没有内置方式。您最好的运气是将语言环境映射到 firstDayOfTheWeek。可以为每个语言环境制作一个查找表。
  • @Matt — 该语言是获取用户区域设置或一周中首选的第一天的一种非常不可靠的方式。
猜你喜欢
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
相关资源
最近更新 更多