ISO 周数
ISO 周数是 ISO 8601 标准定义的周编号方式。它规定每周从周一开始,一年的第 1 周是包含当年第一个周四的那一周(等价说法:包含 1 月 4 日的那一周)。周数用两位表示,范围 01 到 52 或 53,完整写法形如 2026-W30,带星期几时写作 2026-W30-4。
关键在于「ISO 周年」可能和日历年份不一致:年初年末的几天会被划到相邻年份。比如某年 1 月 1 日若是周五,这几天就归上一年的最后一周;12 月底也可能算作下一年的第 1 周。所以显示周数时必须配套用 ISO 周年,而不是日历年。至于第 53 周,只在这一年以周四开头、或闰年以周三开头时才出现。
常见误区:
- 别和「美式周数」混淆——那种周从周日开始、第 1 周含 1 月 1 日,算法完全不同。
- Python 取 ISO 周数用
%V,必须搭配%G(ISO 周年)和%u,别用%Y,否则跨年时年份会错。 - JavaScript 的
Date没有内置 ISO 周数,需手动计算;Java 可用WeekFields.ISO。
常见问题
ISO 周数和普通的「一年第几周」有什么区别?
最大区别是起算规则:ISO 周一律从周一开始,第 1 周是含第一个周四(即含 1 月 4 日)的那一周;而很多本地或美式算法从周日开始,把含 1 月 1 日的周当第 1 周。对同一天,两者可能给出不同的周数。
为什么周数显示的年份有时和日历年对不上?
因为 ISO 有独立的「周年」概念。年初或年末的几天会被归入相邻年份的周,所以 12 月 31 日可能属于下一年的 W01,1 月 1 日也可能属于上一年的 W52 或 W53。显示时要用 ISO 周年配对,不能用日历年。
一年到底有 52 周还是 53 周?
通常是 52 周。只有当这一年的 1 月 1 日是周四,或者是闰年且 1 月 1 日是周三时,才会出现第 53 周。