🕐 时间戳完全指南:Unix 时间戳与日期互转详解
2026年5月9日 · 阅读约 8 分钟
调试 API 的时候,看到一长串数字 — 1700000000 — 你是不是也愣了一下?这玩意到底是哪天?这就是 Unix 时间戳,计算机世界里的通用时间语言。搞懂它,遇到时间相关的问题就不会抓瞎了。
什么是 Unix 时间戳?
Unix 时间戳(也叫 Epoch 时间)就是从 1970年1月1日 00:00:00 UTC 到现在的总秒数。全球统一,不受时区影响。
举个例子就明白了:
1700000000→ 2023年11月14日 22:13:20 UTC0→ 1970年1月1日 00:00:00 UTC(计算机时间的起点)2147483647→ 2038年1月19日 03:14:07 UTC(32位整数的极限)
10位时间戳 vs 13位时间戳
有个坑特别常见:为什么有时候收到的是10位数字,有时候是13位?
- 10位(秒级): 如
1700000000,Unix/PHP/Python 默认 - 13位(毫秒级): 如
1700000000000,JavaScript/Java 默认
转换很简单:毫秒值除以 1000 取整就是秒级。用我们 在线时间戳转换工具 可以一键互转。
各编程语言中的时间戳操作
JavaScript
// 获取当前时间戳(毫秒)
const now = Date.now(); // 1700000000000
// 时间戳转日期
const date = new Date(1700000000000);
console.log(date.toISOString()); // "2023-11-14T22:13:20.000Z"
// 日期转时间戳
const ts = new Date("2023-11-15").getTime(); // 1700006400000
Python
import time
from datetime import datetime
# 获取当前时间戳(秒)
ts = time.time() # 1700000000.123
# 时间戳转日期
dt = datetime.fromtimestamp(ts)
print(dt.strftime("%Y-%m-%d %H:%M:%S"))
# 日期转时间戳
dt = datetime(2023, 11, 15)
ts = dt.timestamp()
PHP
// 获取当前时间戳
$ts = time(); // 1700000000
// 时间戳转日期
echo date("Y-m-d H:i:s", 1700000000);
// 日期转时间戳
echo strtotime("2023-11-15 10:00:00");
时间戳的常见应用
- 数据库时间字段: 用 INT(10) 或 BIGINT 存时间戳,不操心时区问题
- API 签名: 加时间戳防止重放攻击
- 缓存控制: 用时间戳标记资源版本
- 日志记录: 精确记录事件发生时间
2038年问题
32位有符号整数的最大值是 2147483647,对应 2038年1月19日 03:14:07 UTC。过了这个时间,32位时间戳会溢出变成负数。这就是 2038年问题,跟当年的 Y2K Bug 一个性质。好消息是现在大多数系统已经用 64 位整数了,2038年不会真的世界末日。
时区处理建议
- 后端永远用 UTC 存时间
- 只在 UI 层转成用户时区
- 时间戳本身不含时区信息,它是一个绝对的、无歧义的时间点
- API 通信统一用 UTC 时间戳或 ISO 8601 格式
在线工具推荐
需要快速转换时间戳的时候,直接用我们的 时间戳转换工具,秒级毫秒级互转,同时显示 UTC 和北京时间。
常见问题
Q: 为什么我收到的时间戳是 13 位而别人的是 10 位?
精度不同。13 位是毫秒精度(JavaScript/Java),10 位是秒精度(Unix/PHP/Python)。用之前先确认一下精度,不然转换出来的日期完全不对。
Q: 时间戳是唯一的吗?
同一系统内时间戳随时间递增。但同一秒内可能产生相同的时间戳。要全局唯一,得用 UUID 或自增 ID。
Q: 怎么验证时间戳对不对?
用我们的时间戳转换工具,输入后自动帮你转成易读的日期格式,一目了然。