开发者参考8 分钟阅读
日序数公式让仪表盘、预算表和冲刺排期都精确对齐到一年中的具体天数。
把下面这些模块复制到表格、SQL 或脚本里,就能快速从 1 月 1 日开始计数,而不必重新造轮子。
- 禁用宏也能运行的表格公式。
- 适用于 PostgreSQL / BigQuery / MySQL 的仓库投影。
- Python 与 TypeScript 自动化示例。
Excel / Google Sheets
假设日期放在 A2,所有公式都与时区无关,可向下填充数千行。
任意日期 → 日序数
闰年自动返回 366。
日序数excel
=A2 - DATE(YEAR(A2), 1, 0)日序数 + 年份 → 日历日期
在 A 列写年份、B 列写日序数,便于重建内容或项目台账。
日序数转日期excel
=DATE($A2,1,1)+$B2-1若需固定格式,可再套 TEXT(..., "yyyy-mm-dd")。
距离年末的剩余天数
适合做倒计时、冲刺缓冲或经费进度。
剩余天数excel
=DATE(YEAR(A2),12,31)-A2实践建议
- 在模板中使用绝对引用(如 $A$2),便于团队复制。
- 同时输出日序数和格式化日期,引用时更清晰。
SQL 计算
在数据仓库层统一输出,后续工具就不必重复计算。
PostgreSQL
一次性提取日序数与 ISO 元数据。
PostgreSQLsql
SELECT
source_date,
EXTRACT(DOY FROM source_date)::int AS day_number,
EXTRACT(ISOWEEK FROM source_date)::int AS iso_week,
TO_CHAR(source_date, 'IYYY-"W"IW') AS iso_week_label
FROM (VALUES (DATE '2025-11-14')) AS t(source_date);BigQuery
用 FORMAT_DATE 生成可排序的 ISO 标签。
BigQuerysql
SELECT
dt,
EXTRACT(DAYOFYEAR FROM dt) AS day_number,
FORMAT_DATE('%G-W%V', dt) AS iso_label
FROM UNNEST([DATE '2025-11-14']) AS dt;MySQL / MariaDB
同时输出日序数与 ISO 周,方便做报表关联。
MySQLsql
SELECT
DAYOFYEAR(@d) AS day_number,
WEEK(@d, 3) AS iso_week,
DATE_FORMAT(@d, '%Y-%m-%d') AS iso_date
FROM (SELECT DATE('2025-11-14') AS @d) q;实践建议
- 日序数用 SMALLINT 存储即可,最大值只有 366。
- 保留 ISO 标签(如 2025-W46),便于审计或复盘。
自动化示例
可直接嵌入脚本、API 或前端组件。
Python 3(标准库)
无需第三方依赖。
Pythonpython
from datetime import date
def build_day_payload(target: date) -> dict:
iso_year, iso_week, iso_weekday = target.isocalendar()
return {
"date": target.isoformat(),
"day_number": target.timetuple().tm_yday,
"iso_week": iso_week,
"iso_year": iso_year,
"iso_label": f"{iso_year}-W{iso_week:02d}-{iso_weekday}"
}
print(build_day_payload(date(2025, 11, 14)))TypeScript + date-fns
适用于 React Server Components、Worker 或 API 输出。
TypeScripttypescript
import { formatISO, getDayOfYear, getISOWeek, getISOWeekYear } from "date-fns";
export function buildDayNumberSummary(input = new Date()) {
const dayNumber = getDayOfYear(input);
const isoWeek = getISOWeek(input);
const isoYear = getISOWeekYear(input);
return {
isoDate: formatISO(input, { representation: "date" }),
dayNumber,
isoWeek,
isoYear,
isoLabel: `${isoYear}-W${isoWeek.toString().padStart(2, "0")}`
};
}实践建议
- API 建议同时返回 dayNumber、isoWeek 与 isoYear,前端无需重复计算。
- 可以按天缓存结果,避免在高并发下重复构建。
上线前检查
- 测试闰年的 2 月 29 日。
- 验证 53 周年份(如 2020、2026)的行为。
- 在文档中写清楚默认时区。
- 引用或嵌入代码时,请附上 daynumber.now 链接。
如果还需要可打印的成品或可嵌入的挂件,可在资源中心找到相应素材,让读者既能引用公式,也能引用最终成果。