时间戳转换器 — 在线转换 Unix 时间戳与日期
粘贴 Unix 时间戳立刻看到可读日期,或选个日期得到时间戳。自动识别秒(10 位)和毫秒(13 位)。同时显示 ISO 8601、本地时间和 UTC。浏览器运行,不经过服务器。
Unix 时间戳详解
Unix 时间戳就是从 1970 年 1 月 1 日 00:00:00 UTC("纪元")到现在经过的秒数。现在大概是 17 亿左右。就这么简单——一个整数代表一个时间点,没有时区歧义,没有格式争论。
开发者为什么喜欢它:时间戳比较大小极其简单(数字大 = 时间晚),排序方便,存储紧凑(一个整数列 vs 带时区元数据的 datetime 类型)。每种语言都有内置转换:JavaScript 的 Date.now() 返回毫秒,Python 的 time.time() 返回秒,PostgreSQL 内部用微秒存储。
毫秒 vs 秒的混淆是真实存在的。JavaScript 和 Java 用毫秒(13 位:1715600000000)。Unix/Linux、Python、PHP 和大多数 API 用秒(10 位:1715600000)。如果你转换出来的日期是 1970 年 1 月,你大概是把秒传给了期望毫秒的函数(或反过来)。这个工具根据位数自动检测。
2038 年问题:32 位有符号整数最大值是 2,147,483,647——对应 2038 年 1 月 19 日 03:14:07 UTC。之后 32 位时间戳溢出为负数(回到 1901 年 12 月)。大多数现代系统已经用 64 位时间戳,但嵌入式系统、遗留数据库和某些文件格式仍用 32 位。如果你在构建需要在 2038 年后工作的东西,验证你的时间戳存储是 64 位。
使用方法
- 输入 Unix 时间戳(秒或毫秒)——工具自动检测。
- 或选择日期/时间转换为时间戳。
- 结果同时显示 ISO 8601、本地时区和 UTC。
- 用"获取当前时间戳"按钮获取当前时间的 Unix 时间戳。
什么时候会用到
读取 API 响应和日志中的时间戳
API 返回 {"created_at": 1715600000},你需要知道这是什么日期。或者服务器日志显示 [1715600000.123],你需要和用户报告的"大概下午 2 点发生的"对应起来。粘贴数字,得到日期。
调试 JWT token 过期时间
JWT token 有个 "exp" 字段是 Unix 时间戳。用户报告"我的 token 过早过期了",解码 JWT,拿到 exp 值,粘贴进来,看看它到底设置的什么时候过期。和当前时间戳对比看是时钟偏差还是过期时长设错了。
设置缓存 TTL 和定时任务
需要设置 24 小时后过期的缓存?获取当前时间戳,加 86400(一天的秒数),就是过期时间戳。需要验证定时任务是否在正确时间运行?转换日志时间戳确认。
数据库中时间戳列的查询
数据库的 created_at 存的是整数时间戳。要查"上周所有记录",你需要 7 天前的时间戳。把今天的日期转成时间戳,减去 604800(7 × 86400),用在 WHERE 子句里。
常见坑点
秒 vs 毫秒——看位数
10 位 = 秒(Unix 标准)。13 位 = 毫秒(JavaScript、Java)。如果转换出来是 1970 年 1 月,你搞混了。这个工具自动检测,但你的代码可能不会。永远检查你的 API/库期望什么。
时间戳是 UTC——显示的时区是本地的
时间戳 1715600000 在全世界是同一个时刻。但转换成日期时,显示取决于时区。"2024年5月13日 12:00 UTC" 在中国(UTC+8)是 "2024年5月13日 20:00"。永远用 UTC 存储和传输时间戳;只在显示时转换为本地时间。
不要用时间戳调度跨夏令时变化的任务
如果你用时间戳调度"每天本地时间 9 点",夏令时切换后会差一小时。时间戳不知道夏令时——它只是纪元以来的秒数。对于重复的本地时间事件,存储为 "09:00 America/New_York" 然后动态计算下次执行时间。
负时间戳是有效的(1970 年之前的日期)
时间戳 -86400 是 1969 年 12 月 31 日。有些系统不能正确处理负时间戳(崩溃或返回错误日期)。如果需要表示 1970 年之前的日期,彻底测试你的技术栈。ISO 8601 日期字符串对历史日期通常更安全。
示例
秒级时间戳 → 日期
API 响应中典型的 10 位 Unix 时间戳。
Input
1715600000Output
2024-05-13T12:53:20.000Z (UTC) — 2024年5月13日 周一毫秒级时间戳 → 日期
13 位 JavaScript 时间戳(Date.now() 输出)。
Input
1715600000000Output
2024-05-13T12:53:20.000Z (UTC) — 同一时刻,只是毫秒精度功能特点
- 自动检测秒(10 位)vs 毫秒(13 位)
- 双向转换:时间戳 → 日期 和 日期 → 时间戳
- 同时显示 ISO 8601、本地时间和 UTC
- 一键"获取当前时间戳"按钮
- 处理负时间戳(1970 年之前的日期)
- 数据不发送到服务器,100% 浏览器运行
常见问题
为什么时间戳转换出来是 1970 年 1 月 1 日?
你大概是把秒级时间戳(10 位)传给了期望毫秒(13 位)的函数。乘以 1000:new Date(1715600000 * 1000)。或者反过来:把毫秒时间戳除以 1000 但它本来就是秒,结果就是 1970 年的日期。检查位数。
Unix 时间戳的最大值是多少?
32 位有符号整数:2,147,483,647(2038 年 1 月 19 日 03:14:07 UTC)。64 位:9,223,372,036,854,775,807(大约 2920 亿年后)。JavaScript 的 Date 对象用 64 位浮点数存毫秒,精确到纪元前后约 ±285,000 年。
不同语言怎么获取当前 Unix 时间戳?
JavaScript: Math.floor(Date.now() / 1000)。Python: int(time.time())。PHP: time()。Java: System.currentTimeMillis() / 1000。Go: time.Now().Unix()。除了 JavaScript 的 Date.now() 返回毫秒外,其他都返回秒。
Unix 时间戳受闰秒影响吗?
不受。Unix 时间忽略闰秒——它假装每天恰好 86400 秒。闰秒发生时,Unix 时间要么重复一秒要么跳过一秒(取决于实现)。这意味着 Unix 时间戳和 UTC 不完全对齐,但偏差最多 1 秒,由 NTP 校正。
数据库里该存时间戳还是 ISO 字符串?
大多数情况用数据库原生的 timestamp/datetime 类型(PostgreSQL 的 TIMESTAMPTZ、MySQL 的 DATETIME)。它们原生处理时区转换和比较。用整数时间戳的场景:索引列需要最大查询速度、需要兼容只认 Unix 时间的系统、或者存在没有日期类型的键值存储中。