ISO 周工具包7 分钟阅读
ISO 周序数是跨区域冲刺计划、薪资周期和合规日历的通用语言。
使用以下公式即可获得符合 ISO 8601 的周编号与周起止日期,再也不用手动推算。
- 表格中快速获取周序数、周一与周日。
- 仓库层输出 ISO 年 + 周标签(如 2025-W46)。
- Python / TypeScript 自动化示例。
Excel / Google Sheets
默认日期存放在 A2,所有公式都与区域设置无关。
ISO 周序数(新版 Excel / Sheets)
周一为每周第一天,第 1 周包含 1 月 4 日。
ISO 周序数excel
=ISOWEEKNUM(A2)ISO 周序数(旧版 Excel 备用)
在没有 ISOWEEKNUM 函数的环境使用。
ISO 周备用公式excel
=INT((A2-DATE(YEAR(A2-WEEKDAY(A2-1)+4),1,3)+WEEKDAY(DATE(YEAR(A2-WEEKDAY(A2-1)+4),1,3))+5)/7)由 ISO 年 + 周还原本周的周一 / 周日
A 列写 ISO 年,B 列写周序数。
周起止日期excel
=DATE($A2,1,-2)-WEEKDAY(DATE($A2,1,3))+B2*7 // 周一\n=DATE($A2,1,4)-WEEKDAY(DATE($A2,1,3))+B2*7 // 周日将周一公式与周日公式放在相邻两列,方便查看。
实践建议
- 同时展示 ISO 标签(如 2025-W46)与日期范围,避免沟通歧义。
- 高亮 53 周年份,方便运营和薪资团队提前调整。
SQL 计算
在仓库层输出 ISO 周信息,所有下游报表即可复用。
PostgreSQL
一次性返回周序数、ISO 年与周标签。
PostgreSQLsql
SELECT
source_date,
EXTRACT(ISOWEEK FROM source_date)::int AS iso_week,
EXTRACT(ISOYEAR FROM source_date)::int AS iso_year,
TO_CHAR(source_date, 'IYYY-"W"IW') AS iso_label,
date_trunc('week', source_date)::date AS week_monday
FROM (VALUES (DATE '2025-11-14')) AS t(source_date);MySQL / MariaDB
WEEK(...,3) 表示 ISO 模式(周一开头,包含 1 月 4 日的为第 1 周)。
MySQLsql
SELECT
WEEK(@d, 3) AS iso_week,
YEARWEEK(@d, 3) DIV 100 AS iso_year,
DATE_FORMAT(STR_TO_DATE(CONCAT(YEARWEEK(@d,3),' Monday'), '%X%V %W'), '%Y-%m-%d') AS week_monday
FROM (SELECT DATE('2025-11-14') AS @d) q;BigQuery
输出数值周序数与可读标签,方便 BI 使用。
BigQuerysql
SELECT
dt,
EXTRACT(ISOWEEK FROM dt) AS iso_week,
EXTRACT(ISOYEAR FROM dt) AS iso_year,
FORMAT_DATE('%G-W%V', dt) AS iso_label,
DATE_TRUNC(dt, ISOWEEK) AS week_monday
FROM UNNEST([DATE '2025-11-14']) AS dt;实践建议
- 务必同时保存 ISO 年(IYYY),否则跨年周会对不上。
- 提供周一起始日期,方便 BI 直接画甘特或区间。
自动化示例
嵌入到 API、CLI 或组件中,让工程团队始终引用同一套周序数。
TypeScript + date-fns
输出 ISO 标签以及周一/周日日期。
TypeScripttypescript
import { formatISO, getISOWeek, getISOWeekYear, startOfISOWeek, endOfISOWeek } from "date-fns";
export function buildIsoWeekPayload(input = new Date()) {
const isoWeek = getISOWeek(input);
const isoYear = getISOWeekYear(input);
return {
isoLabel: `${isoYear}-W${isoWeek.toString().padStart(2, "0")}`,
weekStart: formatISO(startOfISOWeek(input), { representation: "date" }),
weekEnd: formatISO(endOfISOWeek(input), { representation: "date" })
};
}Python(标准库)
同时给出 ISO 标签与周起止日期。
Pythonpython
from datetime import date, timedelta
def iso_week_info(target: date) -> dict:
iso_year, iso_week, iso_weekday = target.isocalendar()
monday = target - timedelta(days=iso_weekday - 1)
sunday = monday + timedelta(days=6)
return {
"iso_label": f"{iso_year}-W{iso_week:02d}",
"week_start": monday.isoformat(),
"week_end": sunday.isoformat()
}
print(iso_week_info(date(2025, 11, 14)))实践建议
- API 输出中同时提供 ISO 标签与日期范围,方便业务和内容团队引用。
- 可将「当前周」「下周」的结果缓存到 KV,降低 serverless 调用成本。
ISO 周上线检查
- 验证 53 周年份(如 2020、2026)。
- 确认跨年周的 ISO 年标签是否正确。
- 在文档中强调「周一为起始日」的假设。
- 引用或嵌入代码时,请附上 daynumber.now 链接。
可将这些公式与 week-number 页面及挂件搭配使用,让读者既能引用算法,也能引用最终成果。