Unix 时间戳常见问题
对最常见的 Unix 时间戳问题的快速解答 —— 单位、时区处理、2038 年问题、各语言的转换等。
常见问题
- 什么是 Unix 时间戳?
- Unix 时间戳是自 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来经过的秒数。它是一个与语言无关、与时区无关的整数,能唯一标识时间上的任一时刻。
- 什么是 Unix 纪元?
- Unix 纪元是 1970 年 1 月 1 日 00:00:00 UTC。所有 Unix 时间戳都从这个固定参考点向前测量——负值则向后。选择 1970 年是出于实用考虑:那是贝尔实验室设计 Unix 时一个近期且整齐的年份。
- 10 位和 13 位时间戳有什么区别?
- 10 位时间戳(如 1700000000)表示自纪元以来的秒。13 位(如 1700000000000)表示毫秒。JavaScript 的 Date.now() 返回毫秒;大多数 Unix 系统调用以及 Python、Go、PHP 等语言默认返回秒。
- 为什么 JavaScript 使用毫秒而非秒?
- JavaScript 的 Date API 在设计时是为了匹配 1995 年可用的系统计时器分辨率。使用毫秒可避免亚秒时长的精度损失。在处理服务器生成的以秒计的 Unix 时间戳时,请在传给 new Date() 之前乘以 1000。
- 如何在 JavaScript 中把 Unix 时间戳转换为可读日期?
- 对秒时间戳:new Date(1700000000 * 1000).toISOString()。对毫秒时间戳:new Date(1700000000000).toISOString()。两者都生成像 '2023-11-15T06:13:20.000Z' 的 ISO 8601 字符串。用带 timeZone 选项的 toLocaleString() 进行本地化显示。
- Unix 时间戳是否感知时区?
- 不。Unix 时间戳始终表示 UTC 中的单一时刻。时区信息只在为显示而格式化时间戳时才被应用。处于不同时区的两台设备对同一瞬间会产生相同的 Unix 时间戳。
- 什么是 2038 年问题?
- 把 Unix 时间戳存为 32 位有符号整数的系统只能表示到 2,147,483,647 的值,对应 2038 年 1 月 19 日 03:14:07 UTC。过了那一刻,整数会溢出为一个很大的负数。现代 64 位系统不受影响,但嵌入式系统和遗留数据库可能仍有风险。
- 什么是负的 Unix 时间戳?
- 负的 Unix 时间戳表示 Unix 纪元之前的时刻。例如,-86400 是 1969 年 12 月 31 日 00:00:00 UTC。大多数现代日期 API 都能正确处理负时间戳,但一些较旧的系统和数据库不支持。
- 如何在 Python 中获取 Unix 时间戳?
- 秒用 import time; int(time.time())。对显式 UTC datetime:import datetime; int(datetime.datetime.now(datetime.timezone.utc).timestamp())。毫秒用:int(time.time() * 1000)。
- Unix 时间戳有多精确?
- 标准 Unix 时间戳为秒精度。对于亚秒精度,毫秒时间戳(13 位)在 Web API 和 JavaScript 中常见。一些系统使用微秒(16 位)或纳秒。合适的单位取决于你的应用实际需要的精度。