什么是Unix时间戳,你为什么应该关心?
数据库里那个巨大的数字不是随机的,它是Unix时间戳。了解时间戳的工作原理、与日期的相互转换方法,以及在编程和数据库中的实际应用。
你在调试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。理解它们使调试更快,时间相关代码不那么神秘。