← 返回博客
日期时间教程

时间戳差了八小时或变成 1970 年?检查单位与时区

用同一时刻的秒、毫秒和 UTC 表示,演示时间戳转换与本地日期输入的核对方法。

日志里的时间看起来差了八小时,或者接口给出的日期落在 1970 年,先检查两个独立问题:输入单位是否正确,以及结果采用哪个时区显示。

本教程使用 Unix 时间戳转换。练习用的是一个固定历史时刻,方便所有人得到相同的 UTC 结果;右侧“日期时间”按上方选择的时区解释,默认使用系统时区。

第一步:用一个固定时刻检查秒与毫秒

打开工具,在 Unix timestamp 输入框填写 1704067200,选择“秒”。UTC 结果应为:

2024-01-01T00:00:00.000Z

再把输入改成 1704067200000,选择“毫秒”。UTC 结果应保持相同,说明两种数值表达的是同一个时刻。

表示方式 示例
Unix 秒 1704067200
Unix 毫秒 1704067200000
UTC 字符串 2024-01-01T00:00:00.000Z
UTC+8 当地显示 2024 年 1 月 1 日 08:00:00

在时区选择框搜索“上海”或 Asia/Shanghai,所选时区时间应为 2024-01-01 08:00:00.000 UTC+08:00。判断固定样例是否正确时,同时核对时区标识、UTC 偏移与 UTC 字符串。

第二步:理解“相差八小时”是否真的有错

当地时间与 UTC 可以显示不同钟点,但指向同一个时刻。UTC 字符串末尾的 Z 表示 UTC;左侧另一项结果使用所选时区显示。

如果选择上海时区,本例当地钟点应为 08:00;改成其他时区后,显示会变化,左侧时间戳本身不会因此改变。不要为了让 UTC 与当地文字看起来相同,直接给时间戳加减八小时。

JavaScript 的日期以毫秒表示一个时间点,时区主要影响本地解释与显示。具体含义可参阅 MDN Date 文档。

第三步:从日期生成时间戳

先选择 Asia/Shanghai,再在右侧“日期时间”选择器设置 2024-01-01 08:00。输出的秒应为 1704067200,毫秒应为 1704067200000。

切换时区后,右侧输入的钟点保持不变,并按新时区重新生成时间戳。需要处理纽约、伦敦或其他地区的预约时,应选择目标地区的 IANA 时区,不能把“当地 08:00”当成全球唯一时刻。

例如选择 America/New_York,输入 2024-11-03 01:30,会出现两次候选时间,分别对应 UTC-04:00 和 UTC-05:00,选择后才会生成结果。输入 2024-03-10 02:30 则会提示该时间不存在,需要重新选择。UTC 偏移按输入日期计算,不能把纽约全年当成固定的 UTC-5。

日期选择器的输入精度到分钟。排查毫秒级事件时,应使用左侧时间戳结果或保留接口原始字符串,不要期待右侧选择器保留原始毫秒。

为什么错误单位会让结果落在 1970 年?

把十位秒值 1704067200 当作毫秒,会被解释为距离起点只有约二十天的时刻;把十三位毫秒值当作秒,则可能得到很远的未来日期。

“十位通常是秒、十三位通常是毫秒”只是当代日期的实用线索。历史日期、负数时间戳和未来时间不一定符合这个长度,应以接口文档中的单位为准。

对照日志前再检查三个细节

细节 检查方法
时间字段类型 确认是 Unix 数值、ISO 字符串,还是本地文字
秒与毫秒 明确是否已乘过或除过 1000,避免重复换算
业务发生时间 区分事件时间、服务器接收时间和写入数据库时间

只有同一事件、同一单位、同一显示时区的时间,才适合直接比较钟点。跨机器排查时还应考虑机器时钟是否同步;这个转换工具不负责校准服务器时钟。

最后把结果转回去

用本例先确认单位选择正确,再换成真实日志值,记录原始输入、单位与 UTC 输出。接收方要求整数秒时,不要把毫秒结果直接写入。

需要做“两个日期相差多久”的任务,可使用 日期计算。需要整理接口记录,可先用 JSON 格式化 查看时间字段,再逐一核对;格式化不会自动修正业务时区。

← 查看全部文章