系统时间存储:C/内核用
time_t(32 或 64 位整数,秒),其他语言多用 64 位或浮点(毫秒)。32 位秒数会在 2038 年溢出。
各语言存储类型
| 环境 | 类型 | 单位 |
|---|---|---|
| C/Unix 内核 | time_t(32/64 位整数) | 秒 |
| 64 位系统 | long(64 位) | 秒 |
| JavaScript | Number(64 位浮点) | 毫秒 |
| Java | long(64 位) | 毫秒 |
| Python | float/int | 秒(可带小数) |
溢出问题
32 位秒数溢出(Y2038)
- 范围:-2.1e9 ~ +2.1e9 秒
- 溢出时间:2038-01-19 03:14:07 UTC
- 超过后变成负数,时间解释为 1901 年等错误值
64 位秒数
- 可表示到约 2920 亿年,实际不会溢出
历史问题
| 问题 | 原因 | 影响 |
|---|---|---|
| Y2K | 两位数存年份 | 2000 年变 1900 |
| Y2038 | 32 位 time_t 溢出 | 2038 年后时间错误 |
| 闰秒 | 系统未处理 23:59:60 | 时间戳重复、调度出错 |
| GPS 周翻转 | 10 位周数约 19.7 年归零 | 老设备日期错误 |
| 夏令时 | 本地时间一小时重复/消失 | 唯一键冲突、间隔计算错误 |
结论:32 位秒数会溢出,现代系统正迁移到 64 位 time_t。
张芷铭的个人博客
Comments