时间戳是什么?Unix时间戳怎么转换成日期(秒与毫秒一次分清)

看到接口返回 1798924800,你知道它是什么时间吗?——它就是 Unix 时间戳:从 1970年1月1日 00:00:00 UTC 到这一刻经过的秒数。程序里到处用它,因为它不带时区、全球唯一、排序比较就是一个减法。本文讲清 10 位和 13 位的区别、怎么转换、以及最容易踩的时区坑。

为什么程序要用时间戳,而不是"2026-10-01 12:00"这种字符串?

  • 时区无关:"12:00"在北京和东京不是同一时刻,时间戳是全球唯一的绝对时刻;
  • 比较与排序:判断两个事件谁先谁后,直接比大小,不需要解析字符串;
  • 计算方便:"7 天后"就是加 7×86400 秒;
  • 存储紧凑:一个整数,比字符串省空间,索引也快。

10 位还是 13 位?先看长度

位数单位示例常见来源
10 位秒1798924800Python time.time()、MySQL UNIX_TIMESTAMP()
13 位毫秒1798924800000JavaScript Date.now()、Java System.currentTimeMillis()

拿不准时看位数:10 位基本是秒、13 位基本是毫秒。把毫秒当秒去转,日期会跑到 1970 年附近;反过来则会转到几万年后。本站的时间戳转换工具按位数自动识别,不用手动切换单位。

最容易踩的坑:时间戳没有时区,显示才有

时间戳永远指向同一个绝对时刻,但显示成什么取决于时区。同一个时间戳,UTC 下是 04:00,北京时间就是 12:00。所以核对时间时先确认你看的是"本地时间"还是"UTC 时间"——很多"差了 8 小时"的事故,都是把 UTC 输出当成了北京时间。

各语言获取当前时间戳

JavaScript Date.now()         // 毫秒
Python  int(time.time())        // 秒
Java   System.currentTimeMillis()  // 毫秒
MySQL   UNIX_TIMESTAMP()        // 秒
Go    time.Now().Unix()       // 秒

2038 年问题,需要担心吗?

老系统的 32 位有符号整数最多存到 2038年1月19日(约 21.4 亿秒),之后溢出变负数。现代 64 位系统表示范围远超人类历史,日常开发无需处理;只有维护嵌入式老设备时才要留意。另一个实际限制:任何 64 位毫秒时间戳也只是到约 2.9 亿年后,够用。

时间戳转换 输入时间戳或选日期双向转换,秒/毫秒自动识别,本地时间与 UTC 对照显示
在线转换时间戳

做开发还常用到另外两个"看起来像加密其实是编码"的东西:Base64 编码和 MD5/SHA 哈希,它们的原理和误区分别在两篇文章里展开。

常见问题(FAQ)

Unix时间戳是什么意思?

Unix时间戳是从 1970年1月1日 00:00:00 UTC(协调世界时,称"纪元")到某一时刻经过的秒数,与任何时区无关,所以全球任何服务器算出的同一时刻时间戳完全相同,是程序里表示"绝对时刻"的标准方式。

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

10位是秒级时间戳(如 1798924800),13位是毫秒级(如 1798924800000)。JavaScript 的 Date.now() 和 Java 默认给毫秒,Python 的 time.time() 给秒(带小数)。转换工具一般按位数自动识别,混用时日期会差 1000 倍。

时间戳转换日期为什么会差 8 小时?

因为时间戳本身不带时区,显示时按"本地时区"解释。北京时间是 UTC+8,同一个时间戳在 UTC 下显示 00:00、在北京就是 08:00。核对时间时先确认你看到的是本地时间还是 UTC 时间。

2038年问题是什么?现在还需要担心吗?

一些老系统用 32 位有符号整数存秒级时间戳,最大只能表示到 2038年1月19日,之后会溢出变成负数。64 位系统(现代手机、电脑、服务器)可表示的时间范围远超人类历史,日常开发无需担心,维护嵌入式老系统时才需要注意。

怎么在自己用的语言里获取当前时间戳?

常用写法:JavaScript 用 Date.now()(毫秒);Python 用 int(time.time())(秒);Java 用 System.currentTimeMillis()(毫秒);MySQL 用 UNIX_TIMESTAMP()(秒);Excel 公式 =(NOW()-DATE(1970,1,1))*86400。