纪元时间
纪元时间(Epoch,又称 Unix 时间戳、Unix 纪元、1970)指从协调世界时(UTC)1970 年 1 月 1 日 00:00:00 这一刻起所经过的秒数,这个起点就被称为「Unix 纪元」。例如 0 代表 1970 年元旦零点,1000000000 对应 2001 年 9 月 9 日。它按连续秒数累加,不计入闰秒。
它的价值在于:用一个整数就能无歧义地表示某个绝对瞬间,不依赖时区,便于存储、比较和做差值运算。因此数据库、日志、API 接口和各类编程语言都普遍用它来记录与传递时间。你可以用本站的 timestamp 做时间戳与日期互转,用 time-ago 计算「几分钟前」,用 duration 计算两个时间点之间的间隔。
常见误区:
- 秒与毫秒混淆:多数 Unix 系统用「秒」(10 位数字),而 JavaScript 的
Date.now()返回「毫秒」(13 位数字),两者相差 1000 倍,转换时极易出错。 - 时区错觉:时间戳本身永远基于 UTC,没有时区之分;时区只在「转成可读日期显示」时才介入。
- 2038 年问题:用 32 位有符号整数存储的时间戳会在 2038-01-19 溢出,需改用 64 位存储。
常见问题
纪元时间的起点为什么是 1970 年?
这是 Unix 操作系统设计时选定的约定起点,称为 Unix 纪元。它没有特别的天文含义,只是当年便于计算的一个整数基准,后来被各类系统沿用成了事实标准。
时间戳到底是秒还是毫秒?
取决于来源。传统 Unix、多数数据库和后端用「秒」,通常是 10 位数字;而 JavaScript、Java 等常用「毫秒」,通常是 13 位数字。可以用位数快速判断,二者混用会导致时间差 1000 倍。
1970 年以前的时间能用时间戳表示吗?
可以,用负数表示。例如 <code>-1</code> 代表 1969 年 12 月 31 日 23:59:59 UTC。不过部分老旧系统或库不支持负值,使用前需先确认。