Unix 时间戳与日期转换器

将 Unix 时间戳转换为可读的日期和时间,或将任意日期转换为 Unix 时间戳。支持秒与毫秒。

分享此工具

嵌入到你的网站

什么是 Unix 时间戳?

Unix 时间戳(也称为 Unix time 或 POSIX time)是自 1970-01-01 00:00:00 UTC(Unix 纪元)以来经过的秒数。这是计算中的广泛使用标准,因为它用单个整数表示时间点,使存储、比较和算术运算都很简洁。

JavaScript 内部使用毫秒,所以 Date.now() 返回的是 Unix 时间戳乘以 1000 的结果。许多 API、数据库和后端系统使用秒。这个工具接受任一格式,并根据你输入的数字大小自动检测是秒还是毫秒。

常见的 Unix 时间戳

时间戳日期(UTC)说明
01970-01-01 00:00:00Unix 纪元
1,000,000,0002001-09-09 01:46:4010 亿秒
2,000,000,0002033-05-18 03:33:2020 亿秒
2,147,483,6472038-01-19 03:14:072038 年问题(32 位整数最大值)

为什么是 1970 年?

1970 年 1 月 1 日被选为 Unix 纪元,一是出于约定俗成,二是实际限制。Unix 在 20 世纪 60 年代末和 70 年代初在贝尔实验室开发。开发者需要一个接近当时且整数的起点来表示时间。1970 年 1 月 1 日既足够接近以满足实际需求,又没有特殊的技术意义——只是一个便利的参考点。

其他系统中存在不同的纪元:Windows FILETIME 纪元是 1601 年 1 月 1 日;GPS 时间始于 1980 年 1 月 6 日;NTP 纪元是 1900 年 1 月 1 日。在系统之间转换时,了解每个系统的纪元是必须的。

秒与毫秒

原始的 Unix 时间戳以秒为单位。大多数服务器端语言和系统(Unix shell、Python 的 time.time()、PHP 的 time()、大多数数据库)都使用秒。JavaScript 的 Date.now()new Date().getTime() 返回毫秒。当 JavaScript 前端与后端 API 通信时,这个差异经常是 bug 的来源。

当前的 Unix 时间戳(以秒为单位)通常是 10 位数字(到 2023 年约为 1,700,000,000)。毫秒时间戳是 13 位数字。计算器根据输入数字的位数检测格式并进行相应转换。

2038 年问题

将 Unix 时间戳存储为有符号 32 位整数的系统只能表示纪元后 2,147,483,647 秒以内的日期——即 2038 年 1 月 19 日 03:14:07 UTC。在那之后,32 位有符号整数会溢出成一个大的负数,代表 1901 年的某个日期。

这有时被称为"Y2K38"问题或 Unix 千禧年虫。现代 64 位系统不受影响,因为有符号 64 位整数可以表示大约 2920 亿年内的时间戳。但是,嵌入式系统、旧数据库和较早的 32 位软件可能仍然容易受到影响。许多行业(包括电信、银行和工业控制系统)正在进行持续的迁移工作以解决这个问题。

如何获取当前 Unix 时间戳

语言 / 环境命令
JavaScriptMath.floor(Date.now() / 1000)
Pythonimport time; int(time.time())
PHPtime()
Bashdate +%s
SQL (PostgreSQL)EXTRACT(EPOCH FROM NOW())::int
SQL (MySQL)UNIX_TIMESTAMP()
Gotime.Now().Unix()
RustSystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs()

实际应用

API 开发: REST API 通常在 created_atupdated_at 和 token 过期字段中使用 Unix 时间戳。时间戳不依赖于时区,也不会有歧义——不像格式化的日期字符串,那些依赖于地区和格式约定。

Token 过期: JWT(JSON Web Tokens)在 exp(过期时间)和 iat(签发时间)声明中使用 Unix 时间戳。当当前时间戳超过 exp 值时,token 就过期了。计算过期时间——"这个 token 应该在 24 小时后过期"——需要将 86,400 秒加到当前时间戳上。

缓存 TTL: 缓存过期通常设置为 Unix 时间戳或从当前时间起的秒数。调试缓存问题时,经常需要把存储的过期时间戳转换成可读的日期。

日志分析: 服务器日志通常包含 Unix 时间戳。将它们转换为可读的日期是把日志条目与实际事件关联起来的第一步。

数据库存储: 将时间戳存储为整数而不是格式化字符串,可以避免时区转换 bug,并简化排序、范围查询和算术。查询"过去 7 天的所有记录"就变成了 WHERE created_at > (NOW_UNIX - 604800)

常见问题

什么是 Unix 时间戳?

Unix 时间戳是自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的秒数——这个参考点称为 Unix 纪元(Unix epoch)。它把任意时间点表示为一个整数,便于存储、比较和做运算。它也是大多数操作系统、数据库、API 和编程语言使用的标准时间格式。

如何把 Unix 时间戳转换成日期?

把时间戳输入转换器,它会返回对应的 UTC 时间和你的本地时区时间。工具会自动识别你输入的是秒(10 位数字)还是毫秒(13 位数字)。你也可以反向转换:选择日期和时间,获得对应的 Unix 时间戳。

Unix 时间的秒与毫秒有什么区别?

最初的 Unix 时间戳单位是秒。大多数服务端系统——PHP、Python、Go、Bash、SQL 数据库——使用秒。JavaScript 的 Date.now() 和 new Date().getTime() 返回的是毫秒(Unix 秒 × 1000)。当前秒级时间戳通常是 10 位数字,毫秒级是 13 位数字。把两者搞混,是 JavaScript 前端把时间戳发送给只接受秒的后端时最常见的 bug 之一。

为什么 Unix 时间从 1970 年 1 月 1 日开始?

这个日期由 1970 年代初贝尔实验室的 Unix 开发者选定,作为一个方便且足够接近当时的起点。除了是一个“圆整且较近”的日期之外,并没有特殊意义。其他系统使用不同的纪元:Windows FILETIME 从 1601 年 1 月 1 日开始;GPS 时间从 1980 年 1 月 6 日开始;NTP 从 1900 年 1 月 1 日开始。

什么是 2038 年问题?

把 Unix 时间戳存为有符号 32 位整数的系统,只能表示到 2038 年 1 月 19 日(时间戳 2,147,483,647)。此后数值会溢出为一个很大的负数,表示 1901 年的某个日期。现代 64 位系统不受影响。但遗留的嵌入式系统、较旧的数据库和 32 位软件仍可能受影响,需要在那之前完成迁移。

如何在我的编程语言里获取当前 Unix 时间戳?

JavaScript:Math.floor(Date.now() / 1000)。Python:import time; int(time.time())。PHP:time()。Bash:date +%s。PostgreSQL:EXTRACT(EPOCH FROM NOW())::int。MySQL:UNIX_TIMESTAMP()。Go:time.Now().Unix()。这些都返回从 Unix 纪元开始到当前的秒数。

相关文章