RunToolz iconRunToolz
Welcome to RunToolz!
时间戳编程数据库

什么是Unix时间戳,你为什么应该关心?

数据库里那个巨大的数字不是随机的,它是Unix时间戳。了解时间戳的工作原理、与日期的相互转换方法,以及在编程和数据库中的实际应用。

RunToolz Team2026年1月12日5 min read

你在调试API响应。有个字段叫created_at,值是1704067200。那是哪一天?

那是Unix时间戳。它是自1970年1月1日以来的秒数。一旦你理解它,你会到处看到它。

为什么是1970年?

Unix在1960年代末开发。设计者需要一个时间计算的起点。1970年1月1日足够近而实用,足够早而覆盖大部分计算历史。

那一刻——1970年1月1日UTC午夜——被称为Unix纪元。

想亲自试试吗?转换时间戳

为什么用秒而不是日期?

日期很复杂。时区、夏令时、闰年、不同的月长度。"2024年3月15日下午3点EST"需要大量解析。

时间戳只是一个数字。1710522000。容易存储,容易比较,容易做数学运算。

想知道哪个事件先发生?比较两个数字。想知道某事花了多长时间?减去时间戳。想加24小时?加86400。

时区优势

这里是聪明的部分:时间戳总是UTC。

当东京的某人和纽约的某人都记录同一时刻时,他们得到相同的时间戳。显示可能不同——一个看到上午9点,另一个看到晚上7点——但底层数字是相同的。

这使分布式系统成为可能。数据库、API、日志文件——无论服务器在哪里,都使用相同的参考点。

毫秒 vs 秒

JavaScript使用自纪元以来的毫秒。大多数其他语言使用秒。

1704067200(秒)= 2024年1月1日,00:00:00 UTC 1704067200000(毫秒)= 同一时刻

如果时间戳看起来太大,它可能是毫秒。除以1000。

快速阅读时间戳

一些参考点来校准你的心算:

  • 1000000000(10亿)= 2001年9月9日
  • 1600000000 = 2020年9月
  • 1700000000 = 2023年11月
  • 1800000000 = 2027年1月

当前时间戳在17亿范围内。如果你看到以17开头的东西,它可能是最近的时间戳。

常见操作

当前时间戳:

Math.floor(Date.now() / 1000)  // JavaScript
import time; int(time.time())  # Python

时间戳转日期:

new Date(1704067200 * 1000)  // JavaScript需要毫秒

日期转时间戳:

Math.floor(new Date('2024-01-01').getTime() / 1000)

2038年问题

Unix时间戳最初存储为32位有符号整数。最大值?2,147,483,647。

那是2038年1月19日,03:14:07 UTC。

在那一刻之后,32位系统会溢出。这是时间戳的Y2K。

现在大多数现代系统使用64位整数,数十亿年内不会溢出。但遗留系统存在。如果你在处理旧代码,值得检查。

时间戳何时变得奇怪

负时间戳。 1970年之前的日期是负数。-86400是1969年12月31日。

闰秒。 UTC偶尔添加一秒以与地球自转保持同步。大多数系统忽略这个。偶尔它会造成混乱。

时钟漂移。 服务器的时钟可能不一致。如果时钟没有同步,来自不同机器的两个时间戳可能无法直接比较。


一旦你开始留意,时间戳无处不在。API响应、数据库记录、日志文件、cookie。理解它们使调试更快,时间相关代码不那么神秘。