什么是 Unix 时间戳?
Unix 时间戳(Unix Timestamp)是从 1970 年 1 月 1 日 00:00:00 UTC(称为 Unix Epoch)到某个时刻所经过的秒数。例如 1737820800 表示 2025 年 1 月 26 日 0 点的 UTC 时间。
用一个数字表示时间,带来了巨大的工程便利:比较时间先后变成比较数字大小,计算时间差变成减法,存储和传输都只需要一个整数。这就是时间戳成为计算机系统标准时间表示法的原因。
秒级 vs 毫秒级:最常见的坑
不同系统使用不同精度:Unix/Linux 用秒(10 位数字),JavaScript/Java 用毫秒(13 位数字),部分高频交易系统甚至用微秒(16 位)。判断方法很简单:10 位是秒,13 位是毫秒。
混用精度的后果很严重:把毫秒当秒用,时间会快 1000 倍(显示 57000 年后);把秒当毫秒用,时间会慢 1000 倍(显示 1970 年附近)。接口对接时务必先确认对方使用的精度。
时区问题:为什么差了 8 小时?
时间戳本身不含时区信息——它永远是 UTC 时间。1737820800 这个数字在全世界任何一台电脑上都指向同一个物理时刻。显示为「几点几分」时才需要时区参与:北京时间(UTC+8)显示为 08:00,纽约时间(UTC-5)则显示为前一天的 19:00。
最佳实践:存储和传输永远用 UTC 时间戳,只在展示层转换为用户本地时区。服务器、数据库、接口全程 UTC,可以从根源上杜绝时区混乱。
快速转换:在线时间戳工具
日常调试中最常见的操作:拿到一个时间戳想知道是哪天,或者想把「2025-02-01 12:00:00」转成时间戳。在线工具支持双向转换、秒/毫秒自动识别、批量转换、当前时间戳实时显示。
各语言时间戳转换代码
JavaScript:获取当前毫秒时间戳 Date.now();转日期 new Date(1737820800000)。Python:time.time() 获取秒级时间戳;datetime.fromtimestamp(ts) 转日期。Java:System.currentTimeMillis();Instant.ofEpochSecond(ts)。Go:time.Now().Unix();time.Unix(ts, 0)。
PHP:time();date('Y-m-d H:i:s', ts)。MySQL:UNIX_TIMESTAMP();FROM_UNIXTIME(ts)。这些是最常用的速查代码,建议收藏备用。
2038 年问题
32 位有符号整数能表示的最大时间是 2038 年 1 月 19 日 03:14:07 UTC,之后就会溢出变成负数(显示为 1901 年)。这就是著名的「2038 年问题」,类似当年的千年虫。
现代 64 位系统已不存在此问题(64 位时间戳可用 2920 亿年),但老旧嵌入式设备、32 位数据库字段仍需注意。新系统设计时务必使用 64 位存储时间戳。