Unix 时间戳转换
输入时间戳得到日期,输入日期得到时间戳,秒和毫秒自动识别,时区可选。
输入
结果
秒和毫秒:最容易出错的 1000 倍
Unix 时间戳是从 1970-01-01 00:00:00 UTC 起经过的秒数。服务器和数据库里常见的是秒(10 位),而 JavaScript、Java、Go 里很多接口用的是毫秒(13 位)。两者差 1000 倍,把毫秒当秒读,日期会跑到五万多年以后;把秒当毫秒读,就会掉到 1970 年 1 月。看到离谱的日期,先检查单位,再检查时区。
秒和毫秒在数值上可以互换,转换时不要直接乘除后截断掉精度:秒转毫秒要乘 1000,毫秒转秒在多数场景应该向下取整,并明确约定好口径,避免同一分钟内出现两次不同结果。
时区:存 UTC,只在展示时转换
时间戳本身是绝对时刻,不随时区变化——同一时刻在任何机器上都是同一个数。会变的是它显示成的日期文字。所以分布式系统里比较稳的做法是:存储和传输统一用 UTC 或时间戳,只在展示层按用户所在时区格式化。反过来,把「2024-01-01 00:00:00」这种不带时区的字符串当绝对时刻传递,是跨时区协作里最经典的坑。
本页输入的时间戳会按你选的时区显示,输入日期时间时也按同一个时区解释。切换时区后结果会变,但时间戳的数值不变;只有在你输入日期时间字符串时,切换时区才会得到不同的时间戳。
常见问题
怎么分辨时间戳是秒还是毫秒?
看位数。10 位通常是秒,13 位是毫秒,相差 1000 倍。不确定就先想想「这个时间戳乘 1000 或除以 1000 之后,日期是否落在合理范围内」。
时间戳会随时区变化吗?
不会。同一时刻在任何时区的 Unix 时间戳都是同一个数,时区只影响它显示成几点几分。服务器之间传时间戳不需要先换算时区。
不带时区的日期时间字符串按什么解释?
按你在页面上选的时区解释。例如选了 Asia/Shanghai,
2024-01-01 00:00:00 就是北京时间零点;同一串文字在 UTC 下会得到另一个时间戳。带 Z 后缀的输入按 UTC 处理。碰到夏令时切换造成的「不存在的时刻」(例如纽约 3 月某天的 02:30),工具会顺延到切换后的时间,这与系统日期库的常见行为一致。提示「单位不确定」怎么办?
你输入的位数不常见(例如 8 位、11 位),工具不会替你猜单位。请在上方的「单位」里手动选秒或毫秒,或者把输入改成标准的 10 位秒 / 13 位毫秒。
为什么跨时区换算结果和同事的不一致?
多半是有人把本地时间字符串当成了绝对时刻。约定统一用 UTC 或 Unix 时间戳存储、只在界面层做时区转换,这类问题基本就会消失。