面向 Excel、仓库与 API 的 ISO 周编程指南

用标准化的 ISO 周算法保持冲刺节奏、薪资周期与分布式团队完全同步。

最后更新: 2025年11月19日
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 页面及挂件搭配使用,让读者既能引用算法,也能引用最终成果。

周序数编程指南与代码片段