什么是 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位 | 1700000000 | Linux date +%s、Python int(time.time()) |
| 毫秒级 | 13位 | 1700000000000 | JavaScript 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位,没有这个问题。
在线转换步骤
- 打开 时间戳/日期转换器。
- 「时间戳→日期」:输入10位或13位数字,立即看到对应的日期时间和时区。
- 「日期→时间戳」:选择日期和时间,立即获得秒级和毫秒级时间戳。
- 「时区转换」:输入时间戳,选择目标时区,查看各地时间。
常见问题 FAQ
2038年问题会造成什么影响?
32位系统的时钟会在2038年1月19日溢出,导致时间变成1901年(有符号int溢出后变成负数,被解析成1901年)。嵌入式设备是主要风险点。普通电脑现在都是64位,不受影响。
秒级和毫秒级时间戳怎么区分?
看位数:10位是秒级,13位是毫秒级。也可以看数值大小:1700000000显然是秒级(如果是毫秒级,对应的年份是1970年刚过);1700000000000显然是毫秒级。
数据库中应该存时间戳还是datetime?
推荐存时间戳(整数类型)。好处:时区无关、计算方便(两个时间戳相减就是间隔秒数)、跨语言兼容。显示时再根据用户时区转成可读格式。MySQL的 TIMESTAMP 类型内部就是存UTC时间戳。