关于时间戳转换
Unix 时间戳是从 1970-01-01 00:00:00 UTC 起算的秒数或毫秒数,它本身没有时区,要显示成本地时间必须带上换算时的时区偏移。这就带来最常见的坑:同一串数字在服务器上按 UTC 显示、在浏览器里按东八区显示,相差正好 8 小时,看起来像转换算错了。另一个高频问题是位数:10 位是秒,13 位是毫秒,把 13 位当秒解析会落到公元五万多年。2038 年 1 月 19 日 03:14:07 UTC 是 32 位有符号整数秒的溢出点,超过之后老系统会回绕成负数。换算在浏览器本地按时区偏移完成,时间戳数值本身不会被改动。
时间戳转换怎么用
- 先判断拿到的数字是 10 位秒还是 13 位毫秒,选对输入单位再粘贴。
- 把数字粘进时间戳框,或改用日期时间框输入,两个方向都能互转。
- 选时区口径:UTC 还是本地时区,东八区比 UTC 快 8 小时。
- 读取转换结果,包含标准日期时间、星期以及按日/按周的常见写法。
- 核对毫秒位数与 2038 边界,确认结果没有跑到几万年后。
使用提示
- 10 位与 13 位要分清:13 位数字的后三位是毫秒,除以 1000 取整才得到秒,1 秒等于 1000 毫秒,混用会差 1000 倍。
- 时间戳是 UTC 绝对值,同一条记录在北京显示 08:00、在伦敦显示 00:00 属正常现象,不是数据错了;要把北京时间写进库,先减 8 小时偏移。
- 秒值 2147483647 对应 2038-01-19 03:14:07 UTC,再加一秒就会回绕成负数,32 位存储的老设备和嵌入式程序上有这个隐患,新数据用 64 位或毫秒级。
时间戳转换常见问题
10 位和 13 位时间戳有什么区别
10 位是秒级,例如 1700000000;13 位是毫秒级,例如 1700000000000,两者相差 1000 倍。JavaScript 的 Date.now() 返回毫秒,多数后端接口返回秒。拿到 13 位数字先除以 1000 再用,否则会解析成公元五万多年。
时间戳怎么转成北京时间
秒级时间戳按 UTC 起算,加 8 小时偏移(东八区 UTC+8)就是北京时间。例如 1700000000 对应 2023-11-15 06:13:20 UTC,北京时间是同日 14:13:20。反向换算把北京时间减 8 小时再转成秒数即可。
2038 年问题是什么
32 位有符号整数能存的秒数最多到 2147483647,对应 2038-01-19 03:14:07 UTC,再加一秒就回绕成 1901 年的负数时间。改用 64 位存储或毫秒级时间戳可以规避。老 C 程序、嵌入式设备和部分数据库字段仍有这个隐患。
为什么时间戳显示的时间和本地时间差 8 小时
时间戳按 UTC 起算,浏览器按本地时区渲染,东八区差值正好 8 小时。服务器按 UTC 存、前端按本地读时就会出现这个偏移。换算时显式指定时区口径就能对上,时间戳数值本身不需要修改。