前阵子帮一个老项目擦屁股,翻出段1998年的C代码,时间全用 time_t 直接存。当时没多想,直到有人问这玩意儿2038年还能不能跑。我算了一下,32位平台上有符号 int 的最大值是 2^31-1,对应 UTC 时间 2038-01-19 03:14:07,再过一秒就溢出回绕,直接跳回1901年。时间瞬间倒流七十年,跟穿越小说似的。
这坑最阴的地方是它现在不疼不痒。你写的代码今天跑得好好的,bug 藏在二十多年后才炸。可现实里一堆东西根本等不到那天翻新:工厂里的嵌入式固件、老数据库的 int32 时间列、甚至某些还在出货的物联网设备,全在用这套表示。等真到了那天,日志乱序、证书有效期判定出错、定时任务集体穿越,排查起来能让人头秃。
根治办法其实不复杂,time_t 换成64位,或者时间戳直接上毫秒纳秒,空间换个心安。越早迁改造成本越低,越拖越被动。趁现在手头系统还能动,有空把时间字段过一遍,比到时候救火舒服多了。