设备与系统问题

Unix 时间戳转日期:秒、毫秒和 UTC 说明

把 Unix 时间戳转成日期。看清秒与毫秒、UTC 与本地时间、ISO 8601,以及如何把日期再转回 epoch。

快速回答

Unix 时间戳表示相对 Unix epoch 的时间:1970-01-01 00:00:00 UTC。常见写法是 epoch 起的秒,或 epoch 起的毫秒。

要转对,先确认手头的单位。1720000000 秒对应 2024-07-03 09:46:40 UTC。1720000000000 毫秒是同一瞬间。

时间戳标定的是一个瞬间。UTC、本地时间或 IANA 时区,只改变这个瞬间怎么显示。

这是一篇转换指南:时间戳到日期、日期到时间戳、UTC 与本地、ISO 8601。若数值突然变成 1970 年,多半是秒和毫秒没对上——见 Unix Timestamp 的秒与毫秒:日期为什么会变成 1970。

什么是 Unix 时间戳?

Unix timestamp、Unix time、epoch time 通常指自 1970-01-01 00:00:00 UTC 起经过的时间。这个数字本身不是带时区标签的日期字符串。同一瞬间在 UTC、纽约、东京或首尔,钟面可以不同。Unix 时间戳并不总是秒——实务里毫秒也很常见。

什么是 Unix epoch?

Unix epoch 就是 1970-01-01 00:00:00 UTC。时间戳 0 对应那一刻。正数表示 epoch 之后。有的系统允许负数表示 epoch 之前,但语言和日期范围支持并不统一。

我的时间戳是秒还是毫秒?

1720000000 是秒;1720000000000 是毫秒;二者是同一瞬间。实用线索:大约 10 位常常是秒,大约 13 位常常是毫秒。位数只是经验判断。过去或未来的日期、其他单位、自定义 epoch 都会让外形不同。日期与时间转换器 可用秒、毫秒或自动(≤10 位当秒,≥13 位当毫秒)来转换——单位明确时请自己选。

单位错了,日期为什么会错?

JavaScript Date 要的是毫秒。把 1720000000 当成毫秒传入,会得到 1970-01-20 21:46:40 UTC。把毫秒当秒,或反过来,都会落到完全不同的日期。1970 排查路径见 Unix Timestamp 的秒与毫秒:日期为什么会变成 1970。

new Date(1720000000);
// 1970-01-20T21:46:40.000Z

如何转换以秒计的 Unix 时间戳

秒乘以 1000 得到毫秒。JavaScript Date 以毫秒计,因此用 new Date(timestamp * 1000)。

const timestamp = 1720000000;
const date = new Date(timestamp * 1000);
date.toISOString();
// 2024-07-03T09:46:40.000Z

如何转换毫秒时间戳

把毫秒直接传给 Date。不要再给已经是毫秒的时间戳乘一次 1000。

const timestamp = 1720000000000;
const date = new Date(timestamp);
date.toISOString();
// 2024-07-03T09:46:40.000Z

同一时间戳为何会显示成不同时刻?

Unix 时间戳对应的是同一个瞬间。用 UTC、本地时间或选定的 IANA 时区来显示,钟面才会变。对 1720000000000,UTC 是 2024-07-03 09:46:40。当天 America/New_York 是 2024-07-03 05:46:40(EDT)。Asia/Seoul 是 2024-07-03 18:46:40(UTC+9)。纽约和首尔的数值来自 Intl,不是写死的固定时差口号。

Unix 时间戳里有没有时区?

没有。它并不保存 America/New_York 或 Asia/Seoul。时间戳只标定瞬间。时区是在把该瞬间格式化成人能读的日期时间时才套上的。epoch 相对 UTC 定义;数字本身并不是「UTC 时区字段」。

Unix 时间戳与 ISO 8601

1720000000 和 2024-07-03T09:46:40Z 可以表示同一瞬间。Unix 是经过时间的数值。ISO 8601 是可读的日期时间字符串,末尾可以是 Z(UTC)或数字偏移。Z 表示 UTC,有时也叫 Zulu。二者不是同一种格式。

怎样取得当前的 Unix 时间戳?

在 JavaScript 里,Date.now() 是毫秒。Math.floor(Date.now() / 1000) 是秒。不要在文章里写死「现在」;它一直在走。

Date.now();
Math.floor(Date.now() / 1000);

能把日期再转回 Unix 时间戳吗?

能。从明确的 UTC ISO 字符串出发,getTime() 得到毫秒;除以 1000 再向下取整就是秒。

const date = new Date("2024-07-03T09:46:40Z");
date.getTime();
// 1720000000000
Math.floor(date.getTime() / 1000);
// 1720000000

小心含义不清的日期写法

03/07/2024 按地区既可能是 3 月 7 日,也可能是 7 月 3 日。优先用带时区或偏移的 ISO 风格。日期与时间转换器 会拒绝 01/02/2026 这类含混数字日期,并要求日期选择器或 ISO 风格的值。

夏令时怎么算?

Unix 时间戳并不保存 DST 标记。本地显示会套用该时区的规则。America/New_York 在冬季和夏季用不同偏移,所以「纽约是 UTC-5」并非四季都成立。

Unix 时间戳包不包括闰秒?

常见的 POSIX/Unix time 不会把闰秒当成连续标尺上多出来的 SI 秒。平台之间可能有差别。日常转换可以忽略这一层细节。

Unix 时间戳转换的常见失误

这些混用会得到错误日期或错误钟面:

把秒当成毫秒
现代的秒值在 JavaScript Date 里会落到 1970 年附近。

把毫秒当成秒
日期会跳到很远的未来。

把 10 位或 13 位当成铁律
位数是线索,不是保证。

把 UTC 和本地时间搞混
瞬间相同;显示出来的钟点可以不同。

以为数字里面藏着时区
IANA 名称在显示时才套用,并不存在时间戳里。

含混日期、DST 口号,或多余的 ×1000
用 ISO 风格输入。不要再给毫秒时间戳乘一次。

经过核对的 UTC 示例

下列 UTC 钟面时刻是算出来的,不是猜的:

输入 单位 UTC
0 秒 1970-01-01 00:00:00
1720000000 秒 2024-07-03 09:46:40
1720000000000 毫秒 2024-07-03 09:46:40
1720000000 毫秒 1970-01-20 21:46:40

一份简单的转换判断步骤

来源写明了单位,就按它来。没写,就先看位数——再核对日期是否说得通。API 要毫秒时,把秒转成毫秒。显示可选 UTC、本地或某个 IANA 时区。ISO 8601 适合存储和交换。

  • 手头有 Unix 时间戳
  • 单位写明了吗?有就用;没有就看数量级
  • 是秒?API 要毫秒就 ×1000
  • 是毫秒?在毫秒 API 里直接用
  • 按 UTC、本地或 IANA 时区显示
  • 需要字符串?ISO 8601 往往合适
数字是瞬间。格式化才决定钟面。
时间戳是瞬间,不是显示格式

时间戳标定的是一个时间点。UTC、本地时间或时区,只决定这个瞬间怎么给人看。

在浏览器里转换 Unix 时间戳

NEXNARA 日期与时间转换器 可转换 Unix 秒和毫秒,显示 UTC、本地时间和 ISO 8601,并在 IANA 时区之间转换。

Unix 模式支持秒、毫秒、自动单位、当前时间和日期转时间戳。时区模式可搜索 IANA 名称、使用浏览器时区,并套用考虑夏令时的 Intl 偏移。格式模式提供按地区可读的输出、12/24 小时制,以及含混日期防护。日期差是另一个模式。

转换使用浏览器的 Date 和 Intl API。超出 Date 能表示的范围会被拒绝。自动单位不会去猜 11–12 位的值;请选择秒或毫秒。

日期和时间戳的转换本身在浏览器内完成。转换不会把输入发到 NEXNARA 服务器。广告和其他站点功能仍会使用网络。

把时间戳贴进 日期与时间转换器,先对比 UTC、本地时间和 ISO 8601,再选定单位。

FAQ

怎样把 Unix 时间戳转成日期?

先确认单位。JavaScript 里秒用 new Date(n * 1000),毫秒用 new Date(n)。再按 UTC、本地或某个时区格式化。

Unix 时间戳到底是秒还是毫秒?

两种都有。大约 10 位常常是秒,大约 13 位常常是毫秒,但这只是经验判断,不是规则。

为什么我的时间戳显示成 1970?

多半是把秒值按毫秒去读了。见 Unix Timestamp 的秒与毫秒:日期为什么会变成 1970。

Unix 时间戳一定是 UTC 吗?

epoch 相对 UTC 定义,数字标定的是瞬间。显示用的时区是另一回事。它并不是存好的「UTC 时区字段」。

Unix 时间戳里含有时区吗?

不含。它不携带 IANA 标识。时区是在格式化这个瞬间时才套上的。

怎样把日期转成 Unix 时间戳?

从 UTC ISO 字符串出发,date.getTime() 是毫秒;Math.floor(date.getTime() / 1000) 是秒。