什么是 Unix 时间戳

Unix时间戳(也叫Epoch时间)的定义是:从 1970年1月1日 00:00:00 UTC 到指定时间的秒数

选择1970年作为起点是历史原因——早期Unix系统在1969-1970年间设计,就用了当时「最近的整年」作为起点。这个起点叫epoch,所以时间戳也叫epoch时间。

举个实例:1700000000 对应的是 2023-11-14 22:13:20 UTC。

秒级 vs 毫秒级

类型位数示例典型来源
秒级10位1700000000Linux date +%s、Python int(time.time())
毫秒级13位1700000000000JavaScript Date.now()、Java System.currentTimeMillis()

在线转换工具会自动识别秒级和毫秒级,不需要手动指定类型。

各语言获取时间戳

// JavaScript
Date.now()              // 毫秒级
Math.floor(Date.now()/1000)  // 秒级

# Python
import time
int(time.time())        // 秒级

// Java
System.currentTimeMillis();  // 毫秒级

-- MySQL / PostgreSQL
SELECT UNIX_TIMESTAMP();   -- 秒级
SELECT EXTRACT(EPOCH FROM NOW());  -- PostgreSQL秒级

-- Linux 命令行
date +%s                  // 秒级

2038年问题

32位有符号int最大值是 2^31-1 = 2147483647,对应 2038-01-19 03:14:07 UTC。32位系统在这个时间点后会溢出变成负数,导致时间计算全部出错。

这个问题和千年虫(Y2K)类似,但更严重——千年虫主要是显示问题,2038年问题是整数溢出,会导致崩溃。

影响范围:主要担心嵌入式设备(路由器、IoT设备,可能用32位处理器且会运行到2038年以后)。普通电脑和服务器现在几乎都是64位,没有这个问题。

在线转换步骤

  1. 打开 时间戳/日期转换器
  2. 「时间戳→日期」:输入10位或13位数字,立即看到对应的日期时间和时区。
  3. 「日期→时间戳」:选择日期和时间,立即获得秒级和毫秒级时间戳。
  4. 「时区转换」:输入时间戳,选择目标时区,查看各地时间。

常见问题 FAQ

2038年问题会造成什么影响?

32位系统的时钟会在2038年1月19日溢出,导致时间变成1901年(有符号int溢出后变成负数,被解析成1901年)。嵌入式设备是主要风险点。普通电脑现在都是64位,不受影响。

秒级和毫秒级时间戳怎么区分?

看位数:10位是秒级,13位是毫秒级。也可以看数值大小:1700000000显然是秒级(如果是毫秒级,对应的年份是1970年刚过);1700000000000显然是毫秒级。

数据库中应该存时间戳还是datetime?

推荐存时间戳(整数类型)。好处:时区无关、计算方便(两个时间戳相减就是间隔秒数)、跨语言兼容。显示时再根据用户时区转成可读格式。MySQL的 TIMESTAMP 类型内部就是存UTC时间戳。