epoch 毫秒转日期:转换 13 位时间戳和 long 值

把 epoch 毫秒转换为可读日期的指南。涵盖 13 位时间戳、JavaScript Date、Java long 值、毫秒与秒,以及为什么错误的单位会产生 1970 年或很遥远的日期。

什么是 epoch 毫秒

epoch 毫秒计数自 1970 年 1 月 1 日 00:00:00 UTC 起的毫秒。它使用与 Unix 秒相同的 Unix 纪元,但精度多三位。现代的 epoch 毫秒值通常为 13 位,如 1700000000000。

如何把 millis 转为日期

如果值已经是毫秒,JavaScript Date 可以直接读取。如果接收工具期望秒,请先除以 1000。主要错误是在错误的边界上做乘除。

  • JavaScript: new Date(1700000000000).toISOString()
  • Milliseconds to seconds: Math.floor(1700000000000 / 1000)
  • Seconds to milliseconds: 1700000000 * 1000
  • Java Instant: Instant.ofEpochMilli(1700000000000L)
  • Python: datetime.fromtimestamp(ms / 1000, tz=timezone.utc)

在 Java 和数据库中把 long 转为日期

搜索「long 转日期」通常来自 Java、Kotlin、Android,或把时间戳存为 64 位整数的数据库导出。该值可能是 epoch 毫秒,但也可能是秒、微秒或纳秒。转换前请检查位数。

  • 10 位:很可能是 Unix 秒
  • 13 位:很可能是 Unix 毫秒或 Java long 毫秒
  • 16 位:很可能是微秒
  • 19 位:很可能是纳秒
  • 始终用单位命名列,例如 created_at_ms

为什么毫秒会转换成奇怪的日期

把毫秒值当作秒会得到极其遥远的未来日期。把秒值当作毫秒会得到接近 1970 年 1 月的日期。位数是最快的诊断方式。

  • 1700000000000 作为毫秒 = 2023-11-14 22:13:20 UTC
  • 1700000000000 作为秒 = 约公元 55840 年,视库而定
  • 1700000000 作为秒 = 2023-11-14 22:13:20 UTC
  • 1700000000 作为毫秒 = 1970-01-20 16:13:20 UTC

epoch 毫秒常见问题

ms 的 epoch 时间和 Unix 时间戳一样吗?
使用相同的纪元,但单位是毫秒而非秒。经典的 Unix 时间戳通常指秒。
epoch 毫秒时间戳有几位?
对当前日期,epoch 毫秒通常为 13 位。
JavaScript 用毫秒还是秒?
JavaScript Date 用毫秒。Date.now() 返回 epoch 毫秒。
如何把 Java long 时间戳转为日期?
若 long 是 epoch 毫秒,用 Instant.ofEpochMilli(value);若是 epoch 秒,用 Instant.ofEpochSecond(value)。先检查位数:13 位通常是毫秒,10 位通常是秒。