如何转换 Unix 时间戳

· 5 分钟阅读

Unix时间戳是计算机存储和传达时间的方式:一个表示自1970年1月1日以来秒数的单一数字。它们出现在API响应、数据库记录、日志文件和JWT令牌中。当您需要知道1711824000实际上是什么日期时,您需要一个转换器。基于浏览器的转换器立即处理数学运算,并允许您双向操作(时间戳到日期,日期到时间戳)。

Unix时间戳的样子

时间戳类型人类可读
01970年1月1日 00:00:00 UTC
10000000002001年9月9日 01:46:40 UTC
12345678902009年2月13日 23:31:30 UTC
17118240002024年3月31日 00:00:00 UTC
1711824000000毫秒2024年3月31日 00:00:00 UTC
21474836472038年1月19日 03:14:07 UTC(32位有符号最大值)

秒和毫秒的区别是三个额外的零。10位数字是秒;13位数字是毫秒。从2024年起,所有基于秒的Unix时间戳都是10位数字,并将一直保持到2286年11月。

如何转换时间戳

  1. 输入时间戳或日期:粘贴Unix时间戳以转换为可读日期,或输入日期以获取时间戳。
  2. 检查格式:转换器根据数字长度自动检测秒vs毫秒。
  3. 读取结果:查看您本地时区、UTC和ISO 8601格式的日期。

Unix时间简史

Unix时间最早在1971年11月由Bell Labs发布的Unix程序员手册中定义。原始纪元是1971年1月1日,但不久之后改为1970年1月1日,并在POSIX.1(1988)中标准化。

选择1970年是任意的但实用的:Unix是在1969-1971年开发的,从操作系统诞生附近开始计数似乎是合理的。从1970年开始计数秒的32位有符号整数给出了从1901年12月到2038年1月的范围,设计者认为这就足够了。

事实并非如此。「2038年问题」(也称Y2K38)是32位有符号Unix时间戳溢出的时刻:在纪元后2147483647秒,下一个滴答翻转为系统解释为1901年12月的负数。大多数现代系统在2000年代和2010年代迁移到64位整数时间戳,但一些嵌入式设备、较旧的数据库和遗留文件格式仍使用32位时间,需要在2038年之前修补。

Unix时间现在是计算机系统中表示时间的事实标准。JSON API、数据库行时间戳、JWT过期、区块链区块时间、IoT传感器读数:几乎所有都直接或间接使用Unix纪元。

秒、毫秒、微秒、纳秒

不同的系统使用不同的精度:

19位时间戳可能混淆期望毫秒的转换器;当您看到异常数字时,请仔细检查源文档。

您在哪里遇到时间戳

代码中的时间戳

常见语言中的快速转换:

JavaScript:

new Date(1711824000 * 1000)            // 来自秒(乘以1000)
new Date(1711824000000)                // 来自毫秒
Math.floor(Date.now() / 1000)          // 当前时间(秒)
Date.now()                             // 当前时间(毫秒)

Python:

from datetime import datetime, timezone
datetime.fromtimestamp(1711824000, tz=timezone.utc)
datetime.now(timezone.utc).timestamp()  # 当前时间(秒,float)

Bash:

date -u -d @1711824000                 # GNU date(Linux)
date -u -r 1711824000                  # BSD date(macOS)
date +%s                               # 当前时间(秒)

SQL(PostgreSQL):

SELECT TO_TIMESTAMP(1711824000);       -- 将纪元转换为时间戳
SELECT EXTRACT(EPOCH FROM NOW());      -- 当前纪元

Go:

time.Unix(1711824000, 0)               // 来自秒
time.Now().Unix()                      // 当前时间(秒)

时区处理

这是大多数时间戳错误隐藏的地方:

在API中发送时间戳时,始终使用UTC秒。向用户显示时,转换为他们的本地时区。转换器处理两个方向。

常见陷阱

提示

隐私

Unix时间戳转换器完全在您的浏览器中运行。您输入的时间戳和日期永远不会离开您的设备。这很重要,因为时间戳可能很敏感:它们可能来自揭示内部基础设施时序的日志文件、带有嵌入式用户/会话信息的JWT令牌、不应与第三方共享的内部API调试。云时间戳转换器可能会出于「改进」目的记录输入;仅浏览器转换器具有零暴露。

基于浏览器的转换在页面加载后也可以离线工作,并且足够快,您可以将时间戳放入字段并在同一时刻看到日期。

常见问题

什么是 Unix epoch 时间?

Unix epoch 时间(也叫 POSIX 时间或 Unix 时间戳)是自 1970 年 1 月 1 日 00:00:00 UTC 起经过的秒数。这是计算机内部表示时间的标准方式。

秒和毫秒时间戳有什么区别?

秒级 Unix 时间戳是 10 位数字(例如 1711824000)。毫秒级时间戳是 13 位数字(例如 1711824000000)。JavaScript 使用毫秒,大多数 API 和数据库使用秒。转换器根据长度自动检测。

为什么我转换的时间相差几小时?

时间戳始终为 UTC。转换器会显示 UTC 和您的本地时间。如果结果与预期不符,您可能是在比较 UTC 输出和本地时间,或反之。

2038 年会发生什么?

将 Unix 时间戳存为 32 位有符号整数的系统将在 2038 年 1 月 19 日溢出。大多数现代系统使用 64 位整数,这将范围扩展到远超任何实际关注。