Back to Articles
后端传回来的 169872... 是什么鬼?开发运维必懂的时间戳陷阱
#timestamp#timezone#developer#运维
那个让新人抓狂的 Bug
场景重现:
你在中国(UTC+8)开发了一个订单系统,用户下单时间是 2023-10-31 10:00:00。
后端数据库存的是这个时间字符串。
老板在美国(UTC-5)出差,打开后台一看:“卧槽,怎么有人凌晨 1 点下单?”
这就是没有统一时区带来的经典灾难。
什么是 Unix 时间戳?
为了解决全球时间不统一的问题,聪明的工程师发明了 Unix 时间戳(Unix Timestamp):
从 1970年1月1日 00:00:00 UTC 到现在的总秒数。
不管你在东京还是纽约,这一刻的 Unix 时间戳都是完全一样的(比如 1698724800)。
它是一个绝对值,不含任何时区信息。
常见的坑
-
秒 vs 毫秒
- Python/PHP 默认返回秒(10位,如
1698724800)。 - Java/JavaScript 默认返回毫秒(13位,如
1698724800000)。 - 这里的 1000 倍差异,是导致“时间显示为 1970 年”或“时间显示为 50000 年”的罪魁祸首。
- Python/PHP 默认返回秒(10位,如
-
夏令时(DST)
- 如果你还在用“手动加减 1 小时”来处理时间,请停止这种危险行为。夏令时的规则每年都可能变,交给专业的库(如 Moment.js, Day.js)去处理。
最佳实践:怎么存?怎么展示?
1. 存储层(Database)
永远只存 UTC 时间,或者直接存 Unix 时间戳(BigInt)。
千万不要存 2023-10-31 10:00:00 这种不带时区的字符串,除非你确定你的业务永远不出海。
2. 传输层(API)
后端给前端吐数据时,建议使用 ISO 8601 格式(带时区信息):
2023-10-31T10:00:00Z (Z 代表 UTC)
或者直接给时间戳。
3. 展示层(Frontend)
前端拿到 UTC 时间后,根据用户浏览器的本地时区进行转换并展示。
这样,中国用户看到的是 10:00,美国老板看到的是 21:00(前一天),大家都开心。
遇到神仙数据怎么办?
有时候对接第三方接口,对方给了一个奇怪的数字,你不知道它是秒还是毫秒,也不确定它是哪个时区的。
这时候,别猜,用工具。
本网站的时间戳转换工具 可以帮你:
- 🔄 智能识别:自动判断是秒还是毫秒。
- 🌍 多时区对照:同时显示本地时间、UTC 时间、以及你关心的任意时区时间。
- ⚡️ 双向转换:输入日期转时间戳,或者输入时间戳转日期,一键搞定。