知识库 · 日期与时间
ISO 8601 日期格式是什么?
简短回答
ISO 8601 是用文本表示日期和时间的国际标准。它的核心写法按从大到小的顺序排列单位:日期写作 2026-10-14,带 UTC 偏移的时刻写作 2026-10-14T09:30:00+02:00。它还定义了 2026-W42-3 这样的周日期、序数日期,以及 P3DT4H 这样的时长。由于没有歧义,且按字母顺序排序即为时间顺序,大多数 API 和数据格式都采用它。
为什么是 YYYY-MM-DD
03/04/2026 在世界上大多数地方是 4 月 3 日,在美国却是 3 月 4 日。ISO 8601 固定了唯一的顺序:先年、再月、后日,年份四位,月和日两位、不足补零,从而消除了猜测。
另一个好处是排序:YYYY-MM-DD 形式的字符串按字母顺序排列,结果与日期先后完全一致,所以 2026-10-14-report.pdf 这样的文件名在任何文件夹里都能正确排列。
| 形式 | 扩展格式(带分隔符) | 基本格式(紧凑) |
|---|---|---|
| 日历日期 | 2026-10-14 | 20261014 |
| 序数日期(一年中的第几天) | 2026-287 | 2026287 |
| 周日期 | 2026-W42-3 | 2026W423 |
| 时刻 | 09:30:00 | 093000 |
| UTC 日期时间 | 2026-10-14T09:30:00Z | 20261014T093000Z |
| 带偏移的日期时间 | 2026-10-14T11:30:00+02:00 | 20261014T113000+0200 |
时间、时区与字母 Z
时间写在日期后面,用 T 隔开。小时采用 24 小时制,秒的小数部分跟在小数点后:09:30:00.250。
Z(读作「Zulu」)表示时间为 UTC:2026-10-14T09:30:00Z。+02:00或-05:00这样的偏移,给出的是当地时间及其与 UTC 的差值。2026-10-14T11:30:00+02:00与上面的 UTC 示例是同一时刻。- 既没有
Z也没有偏移的时间,是时区未知的当地时间。它是合法的 ISO 8601,但其他系统无法判断它指的是哪个时刻。
偏移不等于时区。+01:00 可能是冬季的巴黎,也可能是全年的拉各斯。ISO 8601 只记录偏移,时区规则来自别处,比如 IANA 时区数据库。
周日期与周数
ISO 周从周一开始,第 1 周是包含当年第一个星期四的那一周(等价于包含 1 月 4 日的那一周)。周日期的写法是:年份、W、周数,然后是从 1(周一)到 7(周日)的星期几。
由于一周不会被拆到两年里,在年初年末,ISO 周编号年可能与日历年不同:
| 日历日期 | ISO 周日期 | 原因 |
|---|---|---|
| 2021-01-01(周五) | 2020-W53-5 | 属于 2020 年 12 月 28 日(周一)开始的那一周 |
| 2024-12-30(周一) | 2025-W01-1 | 这一周包含 2025 年 1 月 2 日(周四) |
| 2026-01-01(周四) | 2026-W01-4 | 1 月 1 日本身就是周四 |
| 2027-01-01(周五) | 2026-W53-5 | 2026 年从周四开始,所以有 53 周 |
一年有 52 或 53 个 ISO 周。美国日历的周数常从周日开始,且 1 月 1 日总在第 1 周,可能与 ISO 周数相差一周。
时长与时间区间
时长以 P(period)开头,先写日期部分,再写 T,然后是时间部分。为零的部分可以省略。
| 时长 | 含义 |
|---|---|
P3DT4H | 3 天 4 小时 |
PT30M | 30 分钟 |
P30M | 30 个月,不是 30 分钟:T 很关键 |
P1Y2M10D | 1 年 2 个月 10 天 |
P2W | 2 周 |
PT0.5S | 半秒 |
时间区间用斜杠连接两部分:2026-10-14/2026-10-20(开始和结束)、2026-10-14T09:00Z/PT2H(开始和时长),或 P1D/2026-10-14(时长和结束)。以年和月为单位的时长没有固定的秒数,所以软件是按日历来加,而不是加一个固定的秒数。
RFC 3339:互联网上的严格子集
ISO 8601 允许多种变体,完整的解析器因此很复杂。RFC 3339 为互联网协议选定了一种写法,大多数 JSON API、Atom 订阅源和日志格式都遵循它。
- 必须是完整的日期和时间,且始终使用扩展格式:
2026-10-14T09:30:00Z。 - 每个时间戳都必须带
Z或+02:00这样的数字偏移;不允许不带偏移的当地时间。 - 周日期、序数日期和时长不在其范围内。
-00:00表示时间为 UTC,但原始的当地偏移未知。- RFC 指出,为了便于阅读,可以用空格代替
T,很多数据库就是这样输出的。
常见问题
ISO 8601 日期中的 T 是什么意思?
T 用来分隔日期和时间,如 2026-10-14T09:30:00。RFC 3339 也接受在这个位置用空格,以便阅读。
时间戳末尾的 Z 是什么意思?
Z 表示时间为 UTC,即偏移为零。09:30:00Z 和 09:30:00+00:00 表示同一时刻。
ISO 8601 和 RFC 3339 是一回事吗?
RFC 3339 是 ISO 8601 面向互联网的更严格的子集。所有 RFC 3339 时间戳都是合法的 ISO 8601,但 ISO 8601 还允许 RFC 3339 不支持的写法,比如周日期和时长。
ISO 8601 中哪一周算第 1 周?
第 1 周是包含当年第一个星期四的那个周一到周日。因此,1 月 1 日可能落在上一年的第 52 或 53 周。