⭐ 觉得好用?收藏备用,下次直接打开
🌐 时区 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,老系统存在溢出风险(C/Unix/老 PHP/老金融);现代 64 位系统和数据库(Postgres、MySQL 8、MongoDB)已扩展到 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。

已复制