返回博客

Unix 时间戳时间戳转换日期时间开发工具

Unix 时间戳转换指南:10 位、13 位与时区问题一次讲清

Unix 时间戳怎么转日期?本文讲清 10 位秒级与 13 位毫秒级时间戳的区别,演示时间戳和本地日期双向转换,并排查时区差 8 小时、单位选错与日期格式无效等常见问题,适合接口联调和日志排错。

接口返回 1640995200,它是哪一天?日志里出现 1640995200000,为什么多了三位?把结果转成日期后又比预期多了 8 小时,究竟是数据错了,还是时区没对上?这几个问题都指向同一件事:时间戳转换。本文用固定示例讲清 10 位与 13 位时间戳的区别,并演示如何在日期、秒级时间戳和毫秒级时间戳之间转换。

如果你只想马上得到结果,可以直接打开时间戳转换工具;如果还想知道结果为什么会这样,继续往下看。

Unix 时间戳是什么

Unix 时间戳用一个数字表示某个确定时刻。它以 1970-01-01 00:00:00 UTC 为起点,常见形式是从这个起点累计的秒数。POSIX 将其称为“自 Epoch 起的秒数”,并约定每天按 86400 秒计算;浏览器里的 JavaScript Date 则以毫秒保存同一类时间值。定义可以分别参考 POSIX Seconds Since the EpochECMAScript Date Objects

时间戳的好处是便于排序、比较和跨系统传递。一个数字不需要携带“2026 年 8 月 1 日上午 9 点”这种本地化写法,接收方拿到后再按所需时区显示即可。

这里有个最容易混淆的点:时间戳表示时刻,日期字符串表示这个时刻在某个时区里的钟表读数。 同一个时刻,在上海和伦敦看到的日期时间可能不同,但底层时间戳不变。

10 位和 13 位时间戳有什么区别

现阶段最常见的两种 Unix 时间戳只差一个单位:

类型 常见位数 单位 示例 对应 UTC 时间
秒级时间戳 10 位 1640995200 2022-01-01 00:00:00
毫秒级时间戳 13 位 毫秒 1640995200000 2022-01-01 00:00:00

两者相差 1000 倍:

text
毫秒时间戳 = 秒时间戳 × 1000
秒时间戳 = floor(毫秒时间戳 ÷ 1000)

JavaScript 的 Date.getTime() 返回自 Epoch 起的毫秒数;想得到秒级时间戳,通常再除以 1000 并向下取整。MDN 的 JavaScript Date 文档 也给出了同样的转换方式。

位数只是实用判断,不是永远可靠的格式规范。处理历史日期、极远未来日期或带小数的值时,不能只数位数,最好结合接口文档确认单位。鸭鸭工具让你明确选择“秒(10 位)”或“毫秒(13 位)”,目的就是避免默默猜错。

时间戳转日期:三步得到可读时间

在线时间戳转换工具处理接口或日志里的数字,只需要三步:

  1. 把时间戳粘贴到“时间戳 → 日期时间”输入框。
  2. 选择秒级或毫秒级。
  3. 查看按当前设备本地时区显示的转换结果。

例如输入 1640995200 并选择秒级:

  • 在 UTC 时区,它表示 2022-01-01 00:00:00
  • 在中国标准时间(UTC+8),它显示为 2022-01-01 08:00:00

这不是多算了 8 小时。两个日期字符串描述的是同一个时刻,只是展示时区不同。排查接口问题时,先确认后端返回的是 UTC 时刻还是已经格式化的本地时间,再比较数据。

工具顶部还会实时显示当前日期、10 位秒级时间戳和 13 位毫秒级时间戳。点“使用当前时间”即可把当前秒级值带入转换区,适合快速确认系统时钟或构造测试数据。

日期转时间戳:本地时间如何参与计算

反向转换时,可以使用日期时间选择器,也可以手动输入 YYYY-MM-DD HH:mm:ss。工具会同时给出秒级和毫秒级结果,并提供复制按钮。

假设设备时区是 Asia/Shanghai,输入:

text
2026-08-01 09:00:00

对应结果是:

text
秒级:1785546000
毫秒级:1785546000000
UTC:2026-08-01 01:00:00

这里的 09:00 是本地钟表时间。HTML 的 datetime-local 控件本身不携带时区信息,浏览器根据本地环境解释它;MDN 对 datetime-local 的说明也明确指出,这类输入表示本地日期和时间,而不是带时区的绝对时刻。

如果手动输入后提示日期无效,优先改用页面上的日期时间选择器。不同浏览器对非标准日期字符串的解析可能存在差异,而选择器会提供结构更稳定的本地日期时间值。

为什么时间戳转换会差 8 小时

“差 8 小时”通常不是时间戳计算错误,而是把 UTC 和 UTC+8 当成了同一个显示时区。

情况一:UTC 被当成本地时间

后端给出 2022-01-01T00:00:00Z,其中 Z 表示 UTC。浏览器在中国标准时间下显示时,会转换为当天 08:00。

情况二:无时区日期被当成 UTC

字符串 2022-01-01 08:00:00 没有说明时区。如果一端按上海本地时间理解,另一端却按 UTC 理解,转换后就会产生 8 小时偏差。

情况三:存储和展示混在一起

数据库里保存统一时间戳,前端按用户时区展示,这是常见做法。问题往往出在展示后的本地日期又被当作 UTC 写回。排查时把链路拆开:原始时间戳、UTC 表示、本地表示分别记录,不要只盯着最终页面上的一个字符串。

接口联调和日志排错怎么用

时间戳转换最实用的场景不是背定义,而是快速判断一条数据是否合理。

检查接口字段

先用 JSON 格式化工具展开响应,再把 created_atexpires_atupdated_at 的数字复制到时间戳工具。如果不确定 JSON 报错位置,可以配合阅读用 JSON 格式化工具排查接口问题

建议依次确认:

  • 字段单位是秒还是毫秒;
  • 时间是否落在合理日期范围;
  • 过期时间是否晚于创建时间;
  • 后端文档约定的是 UTC 还是业务时区。

检查定时任务

时间戳适合确认“某个时刻”,cron 表达式适合描述“按什么规律重复执行”。如果你在排查计划任务,可以先用crontab 执行时间工具列出后续运行时间,再把关键时刻与日志中的时间戳互相核对。

检查编码后的数据

有些 Token 或接口载荷会先经过 Base64 表示。先按Base64 编码解码指南还原文本,再检查其中的时间字段,比直接对着一长串字符猜更快。

常见错误与排查顺序

现象 常见原因 处理方法
转换结果落在 1970 年附近 把毫秒值误当成秒值,或输入接近 0 确认接口单位和原始值
日期远超预期 把秒值误当成毫秒值以外的单位,或数据本身异常 对照 10 位/13 位并查接口文档
固定相差 8 小时 UTC 与 UTC+8 混用 同时记录 UTC 和本地显示结果
手动日期无法解析 输入格式或浏览器解析不兼容 使用日期时间选择器
前后端结果相差 1000 倍 一端用秒,一端用毫秒 在字段名或接口文档中明确单位

一个稳妥的排查顺序是:先看单位,再看时区,最后看日期字符串格式。 不要一上来就手动加减 8 小时。那可能暂时让一个样例“看起来正确”,却会把真正的时区约定藏起来。

常见问题

Unix 时间戳本身包含时区吗?

不包含。时间戳表示一个统一时刻,时区只影响这个时刻转换成日期时间后的显示结果。

10 位时间戳一定是秒,13 位一定是毫秒吗?

对当前常见业务日期通常如此,但位数只是经验判断。可靠做法仍是查看接口文档或字段约定。

时间戳转换会把数据上传到服务器吗?

不会。鸭鸭工具的日期解析和时间戳计算都在当前浏览器完成,输入内容不会因为转换操作上传。

秒级时间戳为什么要向下取整?

毫秒除以 1000 后可能有小数。向下取整表示只保留已经完整经过的秒数,也与 Math.floor(Date.now() / 1000) 的常见写法一致。

现在转换一个真实样例

拿一条真实接口响应或日志,先保留原始值,再打开时间戳转换工具分别尝试秒级和毫秒级。只要单位与时区约定明确,时间戳并不难读;真正容易出错的,是系统之间没有把这两个约定说清楚。

本文目录