如何将纪元时间转换为可读日期
将纪元时间转换为日期只需两步——把数字解码为 UTC 上的一个瞬间,再把该瞬间格式化为你需要的时区。本指南讲解心智模型、如何区分秒与毫秒、UTC 还是本地的取舍,并带你前往分语言的配方与即时转换工具。
纪元到日期只需两步
把纪元时间戳转换为可读日期,永远是同样的两步:把数字解码为 UTC 上的一个瞬间,再把该瞬间格式化为你想展示的时区。数字本身不带时区——它只是一个瞬间——所以同一个值会因你格式化所用的时区不同,而显示为不同的挂钟时间(有时是不同的日历日)。下表把一个时间戳呈现在多个时区中;本指南其余部分讲解单位、时区选择与代码。
| 时区 | 1700000000 的本地日期与时间 |
|---|---|
| UTC(规范瞬间) | 2023-11-14 22:13:20 · ISO 2023-11-14T22:13:20Z |
| America/New_York | 2023-11-14 17:13:20 (EST) |
| Asia/Tokyo | 2023-11-15 07:13:20 (JST) |
| Australia/Sydney | 2023-11-15 09:13:20 (AEDT) |
什么是纪元时间?
纪元时间(也称 Unix 时间或 POSIX 时间)是自 1970 年 1 月 1 日 00:00:00 UTC 起经过的秒数。它是计算领域表示瞬间的通用标准。每种编程语言和操作系统都原生支持,使其成为在系统间存储和交换时间戳最可靠的格式。
第 1 步——辨别秒还是毫秒
转换前先确定单位。几乎总能从位数读出,而读错单位是日期出错最常见的原因。
- 10 位(例如 1700000000)→ 自 Unix 纪元起的秒
- 13 位(例如 1700000000000)→ 自 Unix 纪元起的毫秒
- 16 位 → 微秒;19 位 → 纳秒
- 拿不准时,检查解码出的年份是否合理——落在 1970 年或遥远未来说明单位读错了
- 上方的转换器会自动检测单位
第 2 步——按 UTC 解码,再选择时区
Unix 时间戳会解码为精确的一个瞬间。把该瞬间显示为 UTC 还是本地时区,是展示层面的决定,而非数字的属性。面向机器的一切——日志、API、数据库存储、跨服务器比较——都选 UTC,只在向人展示日期的那一刻才转换为用户的 IANA 时区。始终用 IANA 名称(America/New_York)标识时区,绝不用裸偏移量,这样夏令时才会自动套用。
- 面向机器(日志、API、存储)→ 显示为 UTC,带 Z 的 ISO 8601
- 面向用户(截止时间、UI 中的时间戳)→ 转换为用户的 IANA 时区
- 切勿在不带时区的情况下存储本地时间——存储 UTC 加 IANA 时区名称
用代码转换
每种现代语言都有一行内置函数替你完成两步。模式始终相同:以函数期望的单位传入值,并请求 UTC 或某个特定时区。下面给出 JavaScript 等示例;配套配方完整覆盖 JavaScript、Python、PHP、Java、C#、Go、SQL、Excel 与 Google Sheets。
- JavaScript:new Date(1700000000 * 1000).toISOString() → "2023-11-14T22:13:20.000Z"
- Python:datetime.fromtimestamp(1700000000, tz=timezone.utc).isoformat()
- Shell:date -u -d @1700000000 (GNU) / date -u -r 1700000000 (BSD, macOS)
- SQL:TO_TIMESTAMP(1700000000) (Postgres), FROM_UNIXTIME(1700000000) (MySQL)
- 规则:在期望秒的地方就传秒——只有 JavaScript 的 Date 需要 × 1000
转换纪元时间时的常见错误
转换 Unix 时间戳时最常见的错误:
- 在 JavaScript 中忘记把秒乘以 1000——new Date(1700000000) 得到的是 1970 年而非 2023 年
- 在服务端语言中把 JavaScript 的毫秒直接当作秒使用(1000 倍误差)
- 不指定时区,依赖各环境各异的服务器本地时区
- 把时间戳存为字符串而非整数,导致数值比较与运算出错
- 在 Python 中使用已弃用的 datetime.utcfromtimestamp()——应改为给 fromtimestamp() 传入 tz=timezone.utc
相关文章
FAQ
- 如何将纪元时间转换为日期?
- 先辨别数值是秒(10 位)还是毫秒(13 位),再用你所用语言的日期 API 转换——JavaScript 用 new Date(seconds * 1000),Python 用 datetime.fromtimestamp(seconds, tz=timezone.utc),或粘贴到上方的转换器。
- 为什么我的纪元时间戳转换后是 1970 年?
- 你把秒值传给了期望毫秒的函数,多数情况是 JavaScript 的 new Date()。先把 10 位的秒值乘以 1000。
- 纪元时间该转换为 UTC 还是本地时间?
- 日志、API 和跨服务器比较用 UTC,只在展示时才转换为用户的本地时区。纪元值本身与时区无关。
- 在 JavaScript 中如何从 Unix 时间戳得到日期?
- new Date(seconds * 1000) 返回一个 Date 对象,可用 toISOString()、toUTCString() 或 Intl.DateTimeFormat 格式化。需要相乘是因为 JavaScript 的 Date 期望毫秒而非秒。
- 在 Python 中如何从 Unix 时间戳得到日期?
- 要得到带时区的 UTC datetime,用 datetime.fromtimestamp(seconds, tz=timezone.utc)。本地时间则省略 tz 参数,需要 ISO 8601 字符串则追加 .isoformat()。
- 同一个纪元值在不同时区会得到不同日期吗?
- 瞬间在任何地方都相同,但你显示的挂钟日期取决于时区——甚至可能落在不同的日历日。1700000000 在纽约是 11 月 14 日,在东京是 11 月 15 日。
- 如何把时间戳转换为日期?
- 每种现代语言都有一行内置函数。最难的部分是辨别时间戳是秒(10 位)还是毫秒(13 位)——只要单位对了,转换本身从不出错。