ISO 週日歷_思無時
文章推薦指數: 80 %
公曆中的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
延伸文章資訊
- 1ISO-8601 以週為基準的日曆
ISO-8601 以週為基準的日曆. 版本:2021.4 套用到: Tableau Desktop, Tableau Public. ISO-8601 以週 ...
- 2ISO週日曆- 曆法(ISO week date) 资讯| 这是什么? - 遊戲基地 ...
搜索ISO週日曆... iISO週日曆ISO週日曆系統是ISO8601日期和時間標準的一部分,是一種閏週曆系統。 這個系統主要用在政府和商務的會計年度,用以維持時序。
- 3ISO週日曆- 维基百科,自由的百科全书
ISO週日曆系統是ISO 8601日期和時間標準的一部分,是一種閏週曆系統。這個系統主要用在政府和商務 ... (2020年7月24日) 翻譯者可能不熟悉中文或原文語言,也可能使用了 ...
- 42020 week週數在PTT/Dcard完整相關資訊| 數位感-2021年10月
ISO周日历- 维基百科,自由的百科全书- Wikipedia(2020年7月24日) ... 一个日期可以依据ISO星期编号年的格式YYYY 、周数的格式ww 前面加上字母W,和d 从1到7的一个.
- 5ISO 週日歷_思無時
公曆中的2019年12月30日星期一是ISO日曆中2020年第1周的第一天,寫為2020-W01-1或2020W011。 每年的第一個日曆星期有以下四種等效說法:. 本年度第一個 ...