Unix 时间戳完全指南
发布日期:2026年6月18日 | 阅读时间:6分钟
时间戳是编程世界中最基础也最容易出错的概念之一。从数据库存储到 API 设计,从日志记录到缓存过期,时间戳无处不在。本文将深入浅出地讲解时间戳的一切。
什么是 Unix 时间戳?
Unix 时间戳是一个整数,表示从 1970年1月1日 00:00:00 UTC(Unix 纪元,Epoch)到某个时间点的总秒数。例如:
- 0 → 1970-01-01 00:00:00 UTC
- 3600 → 1970-01-01 01:00:00 UTC
- 1719417600 → 2026-06-26 00:00:00 UTC
选择 1970 年作为起点并非随意——Unix 操作系统正是在 1969-1971 年间开发的,这个日期成为了事实标准。
秒 vs 毫秒:最常见的坑
这是开发中最容易搞混的问题。时间戳有两种常见精度:
| 精度 | 长度 | 示例 | 使用场景 |
|---|---|---|---|
| 秒级 | 10 位数字 | 1719417600 | Unix 原生、MySQL TIMESTAMP、大部分 API |
| 毫秒级 | 13 位数字 | 1719417600000 | JavaScript Date.now()、Java System.currentTimeMillis() |
典型案例:当你从 JavaScript 获取 `Date.now()` 得到 1719417600000,直接传给一个期望秒级时间戳的 API,结果就会变成公元 56452 年的日期!所以在使用前一定要确认对方期望的是秒还是毫秒。
各编程语言中的时间戳处理
JavaScript
// 获取当前时间戳(毫秒)
const ms = Date.now(); // 1719417600000
const s = Math.floor(ms / 1000); // 1719417600
// 时间戳 → 日期对象
const date = new Date(ms);
console.log(date.toISOString()); // "2026-06-26T00:00:00.000Z"
// 日期 → 时间戳
const ts = new Date("2026-06-26").getTime();
Python
import time
from datetime import datetime
# 获取当前时间戳(秒,浮点数)
ts = time.time() # 1719417600.123456
# 秒级整数
ts_int = int(ts)
# 时间戳 → datetime
dt = datetime.fromtimestamp(ts_int)
print(dt.strftime("%Y-%m-%d %H:%M:%S"))
Go
import "time"
// 获取当前时间戳
sec := time.Now().Unix() // 秒
msec := time.Now().UnixMilli() // 毫秒
// 时间戳 → Time
t := time.Unix(1719417600, 0)
MySQL
-- 当前时间戳
SELECT UNIX_TIMESTAMP();
-- 时间戳 → 日期
SELECT FROM_UNIXTIME(1719417600);
-- 结果: 2026-06-26 00:00:00
-- 日期 → 时间戳
SELECT UNIX_TIMESTAMP('2026-06-26 00:00:00');
著名的"2038 年问题"
这是一个真实存在的技术问题,和"千年虫"类似。在很多 32 位系统中,时间戳用有符号 32 位整数存储,最大值是 2^31 - 1 = 2147483647。这个值对应的时间是 2038年1月19日 03:14:07 UTC。
超过这个时间点,32 位时间戳会溢出变成负数,相当于回到了 1901 年!这就是著名的 Year 2038 Problem(简称 Y2K38)。
解决方案:
- 使用 64 位整数(绝大多数现代系统已支持)
- 使用字符串存储日期(如 ISO 8601 格式)
- 升级老旧 32 位嵌入式系统
好消息是 64 位时间戳的有效范围大约是 2920 亿年,远超宇宙的年龄,我们不需要再担心溢出问题。
ISO 8601:时间戳的可读替代方案
虽然时间戳在计算机之间传输很方便,但在 API 响应、日志文件、配置文件中,使用人类可读的时间格式更好:
// ❌ 不友好:这是什么时间?
"created_at": 1719417600
// ✅ 推荐:一眼就能看懂
"created_at": "2026-06-26T00:00:00Z"
"created_at": "2026-06-26T08:00:00+08:00" // 带时区
ISO 8601 是全球标准的时间格式,建议在 JSON API 中使用。
实战:常见时间戳场景
1. API 接口中的时间格式选择
- 面向机器的接口(内部微服务):使用秒级时间戳,处理最快
- 面向第三方的接口(Public API):使用 ISO 8601 字符串,易于调试
- 移动端接口:使用毫秒时间戳,和移动端 SDK 对齐
2. 数据库时间存储
- MySQL:TIMESTAMP 类型自动处理时区,范围到 2038 年;DATETIME 无时区概念,范围更大
- PostgreSQL:TIMESTAMPTZ 推荐使用,自动处理时区
- MongoDB:使用 ISODate 格式,底层是 64 位毫秒时间戳
3. 日志系统
日志中混用时间格式会严重影响问题排查。建议统一使用 ISO 8601 格式,并始终包含时区信息:
[2026-06-26T08:00:00+08:00] INFO Request processed in 42ms
[2026-06-26T08:00:01+08:00] ERROR Database connection timeout
使用我们的时间戳转换工具
在线时间戳转换器支持:
- 秒级和毫秒级时间戳互转
- 多种日期格式输出
- 实时显示当前时间戳
- 完全在浏览器本地计算,无需与服务端通信
立即体验:使用时间戳转换器
本文最后更新于 2026年6月26日