Makzan
Makzan

我管理世界職業技能競賽之網站技術項目、舉辦本地設計與開發賽事、開課分享技術心得。一個用網頁來表達自己的作家。

Python 編程|ISO Week Number|今週是 2022 年第一週還是第二週?

ISO 曆的格式是 YYYY-W[1-53]-[1-6],例如今日是 2022-W1-3。這個計算及格式的使用,使每個星期都足 7 日,而每週又只屬於某一年而不跨年。每年多數是 52 週,少數是 53 週。算是一種標準化的計算,嗯,人家叫國際標準嘛。

Python 中內置有 datetime 模組,當中實現了不少和日期、時間相關的功能,例如取得現在日期的 date.today()、現在日期時間的 datetime.today()、相對時間加減計算的 timedelta 等。而今天介紹的主角,是日期物件內的 isocalendar() 函數。

ISO Calendar 返回的是按 ISO 國際標準 8601 計算的當天年份、第幾星期、及星期幾。例如,今天(2022 年 1 月 5 日,星期三)的 ISO 日曆返回值:date.today().isocalendar() 得出 (2022, 1, 3),即今日是 ISO 日曆的 2022 年、第 1 個星期、星期三。

today.isocalendar() 返回 (2022,1 ,3)

光看這組數字,會產出兩個疑問:

  1. 星期日是 0 還是 7?
  2. 2022 年 1 月 1 日明明是上星期六,為甚麼今週是第 1 個星期?那上星期是甚麼?

星期日是 0 還是 7?

雖然我個人平常是以星期日作為每週開始的,但 ISO 計算星期幾,是以星期一為每週開始,星期日結束,為阿拉伯數字 7。據我所知,這是從歐洲工業化開始因應工作日需求而使用星期一作為開始,而週末是包括星期六日,一併放於一週之末,所以星期六、日分別為 6、7。

如何計算第一個星期?

ISO 8601 日曆,以該星期有 4 日或以上來計算該星期是屬於哪一年的。例如如果 1 月 1 日是星期一、二、三、四,該星期就是新一年的第 1 週,而當 1 月 1 日是星期五、六、日,則該星期仍然算為上一年的最後一週,即第 52 週或第 53 週。又或者可以看跨年那星期的星期四,若果星期四仍然是 12 月,則是該年的最後一週,若果星期四已是 1 月,則是該年的第一週。

Python isocalendar() 的使用

2022 年 1 月 1 日是星期六,所以是 ISO 日曆寫法的 2021-W52-6,即 2021 年第 52 週的星期六。而 1 月 2 日星期日則是 2021-W52-7。至 2022 年 1 月 3 日,才踏入 ISO 日曆的 2022 年,所以今個星期是 2022 年的第 1 個星期。

回顧 2021 年 1 月 1 日,星期五,於 ISO 曆也是屬於 2020 年最後一週(第 53 週),再回顧 2020 年 1 月 1 日,星期四,則是 2020 年的第 1 週,所以前一日的 2019 年 12 月 31 日已經歸入 2020-W1 了。

時光機一轉,去到 2023 年 1 月 1 日,星期日,也是 2022 年最後一週,到 2024 年 1 月 1 日,星期一,當天就是 2024 年第一週的開始。即 2024-W1-1。

所以,若使用 isocalendar 計算,大部份日子和我們日常的的曆法(格里曆)是吻合的,而 1 月 1 日—3 日,及 12 月 28—31日,則按所屬星期而和日常使用曆法有所出入。

ISO 曆的特點

ISO 曆的格式是 YYYY-W[1-53]-[1-6],例如今日是 2022-W1-3。這個計算及格式的使用,使每個星期都足 7 日,而每週又只屬於某一年而不跨年。每年多數是 52 週,少數是 53 週。算是一種標準化的計算,嗯,人家叫國際標準嘛。

當然,ISO 曆也定義了年月日的標準寫法,為 YYYY-MM-DD,這又值得另立文章探討,通過此格式的說明文檔,我們可以學習 Python 如何撰寫 DocString 註解函數,及雙底線函數(Dunder Method)於 Python 編程語言中的使用。

— 麥誠 Makzan,2022-01-05。


我是麥誠軒(Makzan),除了正職外,平常我要麼辦本地賽與辦世界賽,要麼任教編程與網站開發的在職培訓。現正轉型將面授培訓內容寫成電子書、網上教材等,至今撰寫了 7 本書, 2 個視頻教學課程。

如果我的文章有價值,請左下角 👍🏻按讚支持,或訂閱贊助我持續創作及分享。


麥誠 Makzan


CC BY-NC-ND 2.0 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

加载中…
加载中…

发布评论