你的电脑心里,藏着一天:1970年1月1日
如果你学过一点编程,或者在电脑上见过一些奇怪的错误提示,你可能注意到一个神秘的日子:
1970年1月1日。
比如:
• 某个软件崩溃了,日志里显示时间变成了 1970-01-01 08:00:00• 你把自己的手机时间调回“自动设置”之前,它可能闪回这个日期 • Unix 系统的 time命令,从这一天开始计时
为什么偏偏是这一天?为什么不是电脑诞生日、互联网生日,或者公元元年?
答案比你想的更简单,也更“程序员脑洞”。
一、计算机怎么“记住”时间?
首先,你要知道一件事:电脑本身并不认识“2026年6月11日”。
电脑只认识数字。它如何记录时间?常见的方式是:选一个起始点,然后数从那个点到现在过去了多少秒。
就像你问一个人“你多大了?”他不会说“生于某年某月”,而是说“我活了X年”。电脑也一样,它不需要记年份,只需要记住一个数字:从某个基准时刻开始,过去了多少秒。
于是问题就变成了:这个基准时刻选哪天?
不同系统选了不同的日子:
• Windows(文件时间):1601年1月1日(为什么?和格雷戈里历法周期有关,不细说) • Excel:1900年1月1日(为了兼容Lotus 1-2-3的一个bug) • Unix/Linux/macOS/Android/iOS内核:1970年1月1日 00:00:00 UTC
我们电脑里最常见的“1970”,正是Unix系统(及其衍生系统)选的那个起点。
二、为什么是1970年?
这要回到20世纪60年代末70年代初,贝尔实验室的几个程序员——丹尼斯·里奇、肯·汤普森等人,正在创造Unix操作系统。
当时他们需要一个简单、统一、跨平台的时间表示方法。有人提议:用一个长整数(32位)来存储从某个时刻起经过的秒数。
那么起点选哪天?
为什么不是1969?(Unix的雏形在1969年诞生)为什么不是1971?(Unix第一版手册在1971年发布)
答案非常随意,甚至有点草率:因为1970年正好是那个年代一个“整数”的起点,而且当时Unix团队的一个成员随口说了一句“那就从1970年1月1日开始吧”。
是的,没有隆重的委员会,没有国家标准,没有历史意义。就是几个程序员觉得这个日子凑整、好记。
更具体的说法是:在最早的Unix文档中,时间被定义为“从1970年1月1日0时0分0秒起经过的秒数”。这个定义随着Unix的流行,被写进了POSIX标准(可移植操作系统接口),于是所有遵循POSIX的系统都沿用了这一天。
1970年1月1日,就这样莫名其妙地成了计算机世界的“公元元年”。
三、从秒数到年月日:一个数学转换游戏
你可能好奇:电脑只存一个秒数,比如 1,782,345,678 秒,它怎么知道今天是哪年哪月?
答案是一个不断除法和取余的过程:
1. 总秒数 ÷ 一年的秒数(≈31556926秒,考虑闰年)→ 得到年份偏移 2. 剩余秒数 ÷ 一月的秒数 → 得到月份 3. 再除一天秒数 → 得到日期 4. 最后得到时、分、秒
这个算法考虑了闰年、不同月份的天数,还挺复杂。但对于CPU来说只是几十次整数运算,一眨眼的功夫。
所以当你打开电脑右下角看时间,其实电脑心里在默默算:“嗯,从1970年1月1日到现在,过去了约17.8亿秒……好,今天是2026年6月11日。”
四、那个著名的Bug:2038年问题
既然用32位整数存储秒数,就会遇到一个上限。
32位有符号整数的最大值是 2,147,483,647(约21.47亿)。从1970年1月1日开始数这么多秒,是哪一天?
2038年1月19日 03:14:07 UTC。
再往后一秒,整数就会溢出,变成负数(-2,147,483,648),对应的时间就会跳回1901年12月13日。
想象一下:2038年,无数仍在使用32位时间戳的系统(比如老式嵌入式设备、旧版Linux内核、某些数据库)将会出现时间倒流——航班系统、银行交易、电力调度……任何依赖精确时间的程序都可能崩溃。
这就是著名的 “2038年问题” ,也叫“Unix千年虫”。
不过别太担心:大多数现代操作系统和应用已经迁移到64位时间戳。64位的最大值可以撑到2920亿年,远远超过宇宙的年龄。而且2038年才到,还有十几年,关键系统大多已经修复。
但有趣的是,2025年的今天,你依然能在一些老旧设备或某些编程环境的默认值里看到1970年的影子。
五、那些年,1970年带来的趣事
• iOS 设备变砖:早期iOS设备,如果你把时间调到1970年1月1日然后重启,它会永久卡在启动界面。苹果后来修复了这个Bug,原因是硬件内部时间校验时发生了负数除法,导致崩溃。 • 数据库的“零日期”:很多数据库里,如果某个时间字段为空,默认会显示1970-01-01。运营人员常开玩笑:“怎么又有一批订单在1970年下单了?” • GPS的时间起点:GPS系统的时间起点是1980年1月6日,但它和Unix时间之间有个常数偏移,程序员做转换时经常搞错。 • Excel 的 1900 年伪装:Excel 把1900年1月1日当作第1天,但它错误地把1900年当作闰年(其实不是),为了兼容早期版本的这个bug,至今没改。
六、一个哲学问题:1970年1月1日之前的世界,怎么表示?
如果你要记录一个古罗马的事件,或者你出生在1969年,电脑怎么存?
答案是:用负数。
比如1969年12月31日,距离1970年1月1日还有1天,所以它存的秒数是 -86,400(负的24小时)。绝大多数时间库都能正确处理负数,表示“基准点之前”。
所以理论上,Unix时间可以一直往前推到1901年(32位下限)甚至更早(64位可以推到几亿年前)。但很少有人用负数时间,因为太不方便了。
实际工程中,如果需要表示古代日期,程序会用其他数据结构(比如格里高利历的字段)单独存储,而不是依赖秒数偏移。
七、我们身边的人怎么看“1970”?
在程序员圈子里,1970年1月1日是一个内部梗:
• 有人写代码注释: // 如果时间等于0,那一定是1970年1月1日,别慌• 有人用它来检测系统是否刚启动 • 有人生日是1月1日,开玩笑说“我是从1970年开始上线的”
对于普通用户,你不需要记住这个日期。但下次你看到手机或电脑突然抽风显示“1970年”,就知道发生了什么——它只是暂时忘记数到第几秒了,又回到了原点。
写在最后
计算机世界有很多“为什么”,答案往往是三个字:习惯了。
1970年1月1日,没有天文学意义,没有政治意义,就是贝尔实验室的几位程序员随手画的一条线。然后整个数字世界围绕这条线,运转了半个多世纪。
就像你问一个钟表匠“为什么表盘上12点在正上方”,他也只能说:因为第一个这么做的人,后面都抄他的。
下一次,当你盯着电脑右下角的日期发呆,可以默默想:
每一秒过去,电脑心里都在给1970年加上一个数。
夜雨聆风