Epoch to Date

如何将纪元时间转换为可读日期

将纪元时间转换为日期只需两步——把数字解码为 UTC 上的一个瞬间,再把该瞬间格式化为你需要的时区。本指南讲解心智模型、如何区分秒与毫秒、UTC 还是本地的取舍,并带你前往分语言的配方与即时转换工具。

纪元到日期只需两步

把纪元时间戳转换为可读日期,永远是同样的两步:把数字解码为 UTC 上的一个瞬间,再把该瞬间格式化为你想展示的时区。数字本身不带时区——它只是一个瞬间——所以同一个值会因你格式化所用的时区不同,而显示为不同的挂钟时间(有时是不同的日历日)。下表把一个时间戳呈现在多个时区中;本指南其余部分讲解单位、时区选择与代码。

时区1700000000 的本地日期与时间
UTC(规范瞬间)2023-11-14 22:13:20 · ISO 2023-11-14T22:13:20Z
America/New_York2023-11-14 17:13:20 (EST)
Asia/Tokyo2023-11-15 07:13:20 (JST)
Australia/Sydney2023-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 位)——只要单位对了,转换本身从不出错。