⭐ 觉得好用?收藏备用,下次直接打开
🌐 时区 UTC+8
当前时间戳
毫秒
当前时间
自动
时间 输入后显示
毫秒
毫秒

时间戳转换工具 支持 Unix 时间戳(秒/毫秒)与标准日期时间格式互转,并支持多时区切换。工具自动识别输入是 10 位秒还是 13 位毫秒。

Unix 时间戳 是从 1970-01-01 00:00:00 UTC(即 Epoch)起经过的时间量。这是计算机表示时间最紧凑、最无歧义的方式——任意时刻在全球都是同一个数字,跨语言跨系统传输不会丢精度。

秒与毫秒的区别

秒时间戳毫秒时间戳
位数10 位13 位
精度1 秒1 毫秒(0.001 秒)
示例17131680001713168000000
常见于PHP、MySQL、ShellJavaScript、Java、Dart
换算毫秒 = 秒 × 1000 / 秒 = floor(毫秒 ÷ 1000)

时区理解:时间戳本身不带时区信息,只是”距 Epoch 的秒数”。看到 “2024-04-09 12:00:00” 这种字符串才需要指定时区——同一时间戳 1712649600,在 UTC+8 是 “20:00:00”,在 UTC 是 “12:00:00”。跨时区数据流转时推荐全链路用时间戳,只在展示层做本地化。

2038 年问题:32 位有符号整数存秒时间戳的最大值到 2038-01-19,老系统存在溢出风险;现代 64 位系统和数据库已扩展到 8 位整数(理论支持到 2920 亿年后),无需担心。

📍使用场景

  • 日志时间还原排查线上问题时把日志里的 Unix 时间戳快速转成可读时间。
  • 跨时区调试服务端 UTC、客户端本地时区对不上时,逐一切换时区核对。
  • 批量转换数据库导出的时间戳列贴进来,和日期格式双向互转。

常见问题

10 位和 13 位的时间戳有什么区别?

10 位是秒时间戳(Unix epoch 以来的秒数),13 位是毫秒时间戳(乘以 1000)。粗判方法:10 位数字约 16-17 亿(2020-2030 年范围)是秒;13 位数字约 1.6-1.7 万亿是毫秒。PHP、MySQL、Shell 常用秒;JavaScript、Java、Dart 默认毫秒。换算关系:毫秒 = 秒 × 1000。

2038 年问题是什么?会不会影响我?

32 位有符号整数存秒时间戳的最大值是 2,147,483,647,对应 2038-01-19 03:14:07 UTC,超出会溢出为负数(回到 1901 年)。这是 Unix/Linux/Windows API 和老数据库的遗留问题。64 位系统和现代数据库(Postgres、MySQL 8、MongoDB)都用 64 位整数,不受影响。嵌入式设备、老 PHP、老金融系统需升级。

JavaScript 里 `new Date()` 和时间戳怎么互转?

`Date.now()` 返回当前毫秒时间戳;`new Date(ms)` 从毫秒时间戳构造 Date。秒时间戳要先乘 1000:`new Date(sec * 1000)`。反向:`date.getTime()` / `+date` 返回毫秒,`Math.floor(date.getTime()/1000)` 得秒。`new Date('2024-04-09')` 会按 UTC 解析(00:00:00 UTC),常导致时区偏差。

时间戳要不要带时区?

Unix 时间戳本身不带时区——它是"距 1970-01-01 00:00:00 UTC 的秒数",全球同时刻的时间戳值完全相同。时区只在"显示为可读时间"这一步起作用。所以数据库、API、日志里存时间戳永远安全;转成 "2024-04-09 12:00:00" 这种字符串前,先明确目标时区。

数据库存时间戳还是 DATETIME?

分两类——跨时区业务(国际化、SaaS)存整型时间戳或 `TIMESTAMP WITH TIME ZONE`,避免时区混乱;单时区业务(国内后台)存 `DATETIME` 更直观,可读性好。MySQL 的 `TIMESTAMP` 类型会按服务器时区存(实际是 UTC 秒时间戳),读写时会自动转换,跨区部署时容易踩坑。

为什么同一时刻不同语言给出的时间戳略有差异?

精度差异:C/Unix/PHP 的 `time()` 秒级;JavaScript 的 `Date.now()` 毫秒级;Node.js 的 `process.hrtime.bigint()` 纳秒级。另一原因是时钟源不一致,系统时间可能被 NTP 周期性微调(可能倒退或跳跃),高精度场景用 monotonic clock。

已复制