ISO 週日歷_思無時

文章推薦指數: 80 %
投票人數:10人

公曆中的2019年12月30日星期一是ISO日曆中2020年第1周的第一天,寫為2020-W01-1或2020W011。

每年的第一個日曆星期有以下四種等效說法:. 本年度第一個 ... MdEditor ISO週日歷 語言:CN/TW/HK 時間 2021-01-2511:15:37 思無時 主題: JavaScript 基礎知識 陽曆:就是以太陽來計算日期的一類曆法; 陰曆:就是以月亮來計算日期的一類曆法; 公曆:屬陽曆的一種,我國現在使用的就是公曆; 農曆:我國的農曆是一種陰陽合曆,用來指導農業十分方便。

所以,陽曆、陰曆是一類曆法,而公曆、農曆是一種曆法。

公曆和農曆的表述方法也是不一樣的 公曆:用阿拉伯數字,如2019年1月9日; 農曆:用漢字,干支紀年,如戊戌年乙丑月丙午日,或戊戌年臘月初四(農曆中,一月、十一月、十二月分別稱為正月、冬月,臘月) 好吧,以前總覺得公曆就是陽曆,農曆就是陰曆。

實際上只是老百姓這樣說。

從理論上是無法等同的。

公曆 我們熟知的是公曆,公曆分為週期為365個日曆日的平年以及週期為366個日曆日的閏年。

閏年是能被4整除的年,然而,百年並不一定是閏年,除非它們能被400整除。

公曆是一種曆法系統,其中的年又叫日曆年,日又叫日曆日。

這種曆法系統由一系列連續的日曆年(可能是無限的)組成,其中每年又劃分成12個順序的日曆月。

週日歷 週日歷是日常生活中不常用到的歷法系統,一般用於政府、商務的會計年度或者學校教學日曆中。

國際標準ISO8601(資料儲存和交換形式·資訊交換·日期和時間的表示方法)中定義的ISO週日歷系統: 一個ISO週數年(也可以簡稱為ISO年)有52或53個完整的星期 以364天或371天取代了常用的365或366天 額外增加出來的一個星期稱為閏周 每個星期從星期一開始 每年的第一個星期包含當年的第一個星期四(並且總是包含1月4日) 國內是採用【GB/T7408-2005/ISO8601:2000】標準(位於4.3.2.2日曆星期,實際上還是採用的ISO8601:2000年版本的標準)。

定義如下: 基於一系列無限連續的日曆星期的歷法系統 每個日曆星期有7個日曆日 參考點是把200。

年1月1日定為星期六 即一年中的第一個日曆星期包括該年的第一個星期四 定一個日曆年有52或53個日曆星期 日曆年的第一個日曆星期可能包含前一個日曆年中的三天,日曆年的最後一個日曆星期可能包含下一個日曆年的三天 書寫格式 公曆中的2019年12月30日星期一是ISO日曆中2020年第1周的第一天,寫為2020-W01-1或2020W011。

每年的第一個日曆星期有以下四種等效說法: 本年度第一個星期四所在的星期 1月4日所在的星期 本年度第一個至少有4天在同一星期內的星期 星期一在去年12月29日至今年1月4日以內的星期 推理可得: 如果1月1日是星期一、星期二、星期三或者星期四,它所在的星期就是第一個日曆星期 如果1月1日是星期五、星期六或者星期日,它所在的星期就是上一年第52或者53個日曆星期 12月28日總是在一年最後一個日曆星期。

一週的開始是星期一還是星期日 按照國際標準ISO8601的說法,星期一是一週的開始,而星期日是一週的結束。

雖然已經有了國際標準,但是很多國家,比如「美國」、「加拿大」和「澳大利亞」等國家,依然以星期日作為一週的開始。

所以在計算一年的第一週的時候,國內日曆和歐美一些國家存在差異。

長年,是有53星期的年 任何從星期四開始的年(主日字母D或DC)和以星期三開始的閏年(ED) 任何以星期四結束的年(D、ED)和以星期五結束的閏年(DC) 在1月1日和12月31日(在平年)或其中之一(在閏年)是星期四的年度 相關計算 1.計算給定年份總週數 (符號向上取整) /** *根據年份計算當年週數 *@param{number}y年 */ functioncomputeWeeks(y){ constleapDay=p(y)===4||p(y-1)===3?1:0 return52+leapDay; } functionp(y){ return(y+Math.ceil(y/4)+Math.ceil(y/100)+Math.ceil(y/400))%7; } /** *實際上JavaScript中獲取一年的週數更簡單 *12月28日所在的週數,始終是一年中的最後一週 *求出12月28日是星期幾,如果早於或等於週四,那該年有53周 *Date.prototype.getDay結果中0表示星期天 *@param{number}y年份 */ functiongetWeeks(y){ constday=newDate(`${y}/12/28`).getDay(); returnday!==0&&day<=4?53:52 } 複製程式碼 2.計算當天ISO週日歷表達 來自TheMathematicsoftheISO8601Calendar /** *計算自0年1月0日起,CE的天數(Gregorian) */ functiongregdaynumber(year,month,day){ y=year; m=month; if(month<3)y=y-1; if(month<3)m=m+12; returnMath.floor(365.25*y)-Math.floor(y/100)+Math.floor(y/400)+Math.floor(30.6*(m+1))+day-62; } /** *根據當前公曆日期計算ISO日曆日期 */ functionisocalendar1(){ vartoday=newDate(); year=today.getFullYear(); month=today.getMonth();//0=January,1=February,etc. day=today.getDate(); wday=today.getDay(); weekday=((wday+6)%7)+1;//getDay返回的值是0~6,這裡轉為1~7 isoyear=year; d0=gregdaynumber(year,1,0); weekday0=((d0+4)%7)+1; d=gregdaynumber(year,month+1,day); isoweeknr=Math.floor((d-d0+weekday0+6)/7)-Math.floor((weekday0+3)/7); //檢查12月的最後幾天是否屬於下一年的ISO周 if((month==11)&&((day-weekday)>27)){ isoweeknr=1; isoyear=isoyear+1; } //檢查一月的前幾天是否屬於上一年的ISO周 if((month==0)&&((weekday-day)>3)){ d0=gregdaynumber(year-1,1,0); weekday0=((d0+4)%7)+1; isoweeknr=Math.floor((d-d0+weekday0+6)/7)-Math.floor((weekday0+3)/7); isoyear=isoyear-1; } if(isoweeknr<10)returnisoyear+"-W0"+isoweeknr+"-"+weekday; if(isoweeknr>9)returnisoyear+"-W"+isoweeknr+"-"+weekday; } 複製程式碼 .給定某一日期,獲取其ISO週日歷表達方式 (weeks是第一個計算中的方法) 常數10 woy指weekofyear doy指dayoftheyear,就是當年的第幾天,取值doy=1→365/366 dow值dayoftheweek,就是星期幾。

使用JavaScript的Date.prototype.getDay方法取值範圍為0到6,對應週日到週六,但是dow的值範圍為1~7,需要相應轉換 如果這樣獲得的星期數等於0,則意味著給定的日期屬於上一個(基於周)的年份 如果獲得的星期數為53,則必須檢查日期是否是第二年的第1周 每月基於1月1日的偏移量 月JanFebMarAprMayJunJulAugSepOctNovDec平年0315990120151181212243273304334閏年0316091121152182213244274305335 例如查詢2016年11月5日星期六的星期數 //使用每月基於當年的1月1日的偏移量計算 woy=Math.floor((10+(305+5)−6)/7) woy=Math.floor(314/7)=44 //既不是0也不是53,所以就是當前週數 複製程式碼 參考 ISOweekdate www.zhihu.com/question/19… TheMathematicsoftheISO8601Calendar 「其他文章」 ISO週日歷 瞭解ANSI轉義碼的color設定 雙重轉義 ReactPortal傳送門-將子節點渲染到存在於父元件以外的DOM節點 「JavaScript」 20個超級實用的JavaScript開發技巧 Deco編輯器高擴充套件性技術架構解析 基於RUM的前端優化理論與實踐-效能篇(一) 高頻:手寫一個防抖函式Debounce 小抄學習法:4張圖掌握JS核心要點 常用的前端JavaScript方法封裝 JavaScriptAST實現原理揭祕 React中的TS型別過濾原來是這麼做的! 【技術乾貨】前端效能優化——快速定位程式碼bug 策略即程式碼:為了OpenPolicyAgent學Rego?試試Javascript



請為這篇文章評分?