张芷铭的个人博客

系统时间存储:C/内核用 time_t(32 或 64 位整数,秒),其他语言多用 64 位或浮点(毫秒)。32 位秒数会在 2038 年溢出。

各语言存储类型

环境类型单位
C/Unix 内核time_t(32/64 位整数)
64 位系统long(64 位)
JavaScriptNumber(64 位浮点)毫秒
Javalong(64 位)毫秒
Pythonfloat/int秒(可带小数)

溢出问题

32 位秒数溢出(Y2038)

  • 范围:-2.1e9 ~ +2.1e9 秒
  • 溢出时间:2038-01-19 03:14:07 UTC
  • 超过后变成负数,时间解释为 1901 年等错误值

64 位秒数

  • 可表示到约 2920 亿年,实际不会溢出

历史问题

问题原因影响
Y2K两位数存年份2000 年变 1900
Y203832 位 time_t 溢出2038 年后时间错误
闰秒系统未处理 23:59:60时间戳重复、调度出错
GPS 周翻转10 位周数约 19.7 年归零老设备日期错误
夏令时本地时间一小时重复/消失唯一键冲突、间隔计算错误

结论:32 位秒数会溢出,现代系统正迁移到 64 位 time_t

Comments