把 Unix 时间戳转换成日期,再把日期转换回时间戳
发布于 · 更新于 阅读约 2 分钟
Unix 时间戳统计的是自通用时间 1970 年 1 月 1 日午夜以来经过的时间。两个问题决定最终的日期:数字的单位,以及您读取结果所用的时区。
一个参考值
转换 Unix 时间戳 会给出同一时刻的三种读法。以 1700000000 为例,浏览器设为巴黎时间:
| 读法 | 结果 |
|---|---|
| UTC 日期 | Tue, 14 Nov 2023 22:13:20 GMT |
| 本地日期 | 2023 年 11 月 14 日 23:13:20 UTC+1 |
| ISO | 2023-11-14T22:13:20.000Z |
本地时间跟随浏览器的时区:巴黎冬季多一小时。同一个时间戳只是一个时刻,在两个时区中读取而已。
单位根据位数识别
默认设置会根据数字的长度识别单位。下面三个值表示同一个时刻,精度不同。
| 数字 | 位数 | 识别出的单位 | 得到的时刻 |
|---|---|---|---|
| 1700000000 | 10 | 秒 | 2023 年 11 月 14 日 22:13:20 UTC |
| 1700000000000 | 13 | 毫秒 | 2023 年 11 月 14 日 22:13:20 UTC |
| 1700000000123456 | 16 | 微秒 | 2023 年 11 月 14 日 22:13:20.123 UTC |
规则:最多 11 位为秒,12 到 14 位为毫秒,15 和 16 位为微秒。“毫秒”设置会强制使用该单位。
规则的陷阱
由于单位是根据长度推断的,含糊的值只会按一种方式读取:10000000000(11 位)得到 2286 年 11 月 20 日,100000000000(12 位)得到 1973 年 3 月 3 日。早于 1973 年 3 月的毫秒时间戳只有 11 位或更少,会被当作秒来读取:此时请强制使用“毫秒”设置。
1970 年之前的值与 2038 年的上限
负数表示 1970 年之前的时刻:-1 得到 1969 年 12 月 31 日 23:59:59 UTC,0 得到 1970 年 1 月 1 日午夜。
数字 2147483647 是有符号 32 位整数能容纳的最大值:它得到 2038 年 1 月 19 日 03:14:07 UTC。下一个数 2147483648 得到 03:14:08:工具可以不受限制地继续,但用 32 位存储时间的系统做不到。
把日期转换成时间戳
输入日期而不是数字:工具会给出以秒和毫秒表示的时间戳。
| 输入 | 以秒为单位的时间戳 | 读法 |
|---|---|---|
| 2026-01-01 | 1767225600 | 通用时间的午夜,未给出时区 |
| 2026-01-01T10:30:00+01:00 | 1767259800 | 巴黎时间 10:30,即通用时间 09:30 |
| 2024-02-29 | 1709164800 | 接受闰年 |
没有时区的日期按通用时间读取,而不是本地时间:工具会在结果中说明。不存在的日期,比如 2026 年 2 月 30 日,会被拒绝并给出提示。
常见错误
- 把毫秒当作秒来读:日期会落到几千年以外。
- 忘记时区:按本地时间读取的日期,再按通用时间发送,会偏差一小时或更多。
- 写日期时不带时区,心里却想着本地时间,而它会按 UTC 被读取。
想计算两个日期之间相隔的天数,请参阅 计算两个日期之间相隔的天数。
检查转换
- 重新读一遍 UTC 那一行,它不依赖于设备。
- 检查结果第一行宣告的单位。
- 把得到的日期再转换回去:应该得到起始的数字。
