Unix 时间戳工作原理
Unix 时间戳(Unix Timestamp)是一种时间表示方式,定义为从格林威治时间 1970年1月1日 00时00分00秒(UTC/GMT)开始所经过的秒数。它不包含时区信息,是一个全球统一的绝对时间值。
秒级 (Second)
10位数字
PHP, Python, Golang 默认
毫秒级 (Millisecond)
13位数字
JavaScript, Java 默认
常见应用场景
💾
数据库记录
在数据库(如 MySQL)中存储 `created_at` 或 `updated_at` 字段。使用整数存储比字符串查询更快,且不依赖数据库时区设置。
🔒
API 签名验证
在 API 请求中加入时间戳参数,服务器验证其时效性(如限制 60 秒内有效),可有效防止重放攻击(Replay Attack)。
📊
日志分析
服务端分布在不同时区时,使用时间戳统一记录日志,可以避免因时区差异导致的日志顺序错乱问题。
⏱️
定时与倒计时
计算两个时间点之间的时间差(如任务耗时、抢购倒计时)时,直接相减时间戳是最简单准确的方法。
常见问题
为什么时间戳是 1970 年开始?
这是 Unix 操作系统设计时的选择,被称为 "Unix Epoch"。1970年1月1日被选为统一的起始时间点,用于简化计算机之间的时间同步和计算。
什么是“2038年问题”?
在 32 位系统中,时间戳使用有符号整数存储,最大值为 2147483647。这个数值对应的时间是 2038年1月19日。届时,时间戳会溢出变成负数,导致系统时间错误。目前的 64
位系统已解决该问题。
JavaScript 如何获取当前时间戳?
可以使用
Date.now() 获取毫秒级时间戳(13位),或者使用 Math.floor(Date.now() / 1000)
获取秒级时间戳(10位)。
不同语言如何处理时间戳?
- Python:
time.time()(秒) - PHP:
time()(秒) - Java:
System.currentTimeMillis()(毫秒) - Go:
time.Now().Unix()(秒)
时间戳包含时区吗?
不包含。Unix 时间戳是基于 UTC(协调世界时)的。无论你在世界的哪个地方,同一时刻的 Unix 时间戳都是一样的。时区转换是在显示给用户时(如转为北京时间)进行的。
如何区分秒级和毫秒级时间戳?
最简单的方法是看长度。目前的时间戳,如果是 10 位数字,通常是“秒”;如果是 13 位数字,则是“毫秒”。
Excel 中如何转换时间戳?
可以使用公式:
(A1 / 86400) + 25569,然后将单元格格式设置为日期。如果是北京时间(+8),则需加上
8小时:(A1/86400) + 25569 + (8/24)。
为什么有时候时间相差8小时?
这是时区问题。中国使用的是东八区(UTC+8),比 UTC 标准时间快 8 小时。在进行转换时,必须确保加上了这8小时的偏移量。