在纯 Javascript 中,如何根据区域设置确定一周是从星期一还是星期日开始?

问题描述 投票:0回答:4

好吧,标题很好解释——我需要弄清楚本地星期几的开始——可以是星期一、星期日、星期六或星期五——在纯 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
4个回答
8
投票

没有片刻。本质上是 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'));


1
投票

基于CLDR的更易维护和可用的版本。

基于国家代码。周日返回 0,周一返回 1,周六返回 -1,周五返回 -2,因此您可以使用它来制作日历。未知国家代码返回 1。

{
let wso = { // fri:1, sat:2, sun:3
    MV:1,
    AE:2,AF:2,BH:2,DJ:2,DZ:2,EG:2,IQ:2,IR:2,JO:2,KW:2,LY:2,OM:2,QA:2,SD:2,SY:2,
    AG:3,AS:3,AU:3,BD:3,BR:3,BS:3,BT:3,BW:3,BZ:3,CA:3,CN:3,CO:3,DM:3,DO:3,ET:3,
    GT:3,GU:3,HK:3,HN:3,ID:3,IL:3,IN:3,JM:3,JP:3,KE:3,KH:3,KR:3,LA:3,MH:3,MM:3,
    MO:3,MT:3,MX:3,MZ:3,NI:3,NP:3,PA:3,PE:3,PH:3,PK:3,PR:3,PT:3,PY:3,SA:3,SG:3,
    SV:3,TH:3,TT:3,TW:3,UM:3,US:3,VE:3,VI:3,WS:3,YE:3,ZA:3,ZW:3,
}
function week_start_offset(country) {
    return (wso[country] || 4) - 3
}
}

console.log(week_start_offset('US'))
console.log(week_start_offset('RO'))

0
投票

最近您可以使用:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/weekInfo

所有浏览器都可用(firefox除外:2023年3月)

代码如下所示:

new Intl.Locale(navigator.language).weekInfo.firstDay // 1 or 7 ...

您可以通过将

navigator.language
更改为所需的语言来检查任何语言环境ex:

new Intl.Locale('fr').weekInfo.firstDay // 1

-3
投票

你可以使用 moment.js

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

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

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

dow

© www.soinside.com 2019 - 2024. All rights reserved.