技术科普
计算机是如何存储时间的?UTC、时间戳与格式化
时间在计算机中如何存储,是很多开发者关心的问题。理解这一点,能帮你避免大量时间相关的Bug。
核心原则:存储用UTC
时间处理有一个重要的最佳实践:存储时使用UTC,显示时转换为本地时间。这样做的好处是:
- 避免夏令时切换带来的混乱
- 避免服务器迁移到不同时区后时间错乱
- 方便跨时区系统统一处理
常见的存储方式
- 整数时间戳:如 Unix时间戳,存储自1970年以来的秒数或毫秒数
- 带时区的时间字符串:如
2027-08-16T10:00:00Z(Z表示UTC) - 数据库专用类型:如 MySQL 的
DATETIME(不带时区)和TIMESTAMP(带时区转换)、PostgreSQL 的timestamptz
容易踩的坑
- 不带时区的时间:存成了本地时间却没有时区标记,容易误读
- 混用类型:有的字段存UTC,有的存本地时间,导致计算错误
- 时区转换错误:忽略夏令时,导致切换日的1小时偏差
推荐做法
- 后端统一使用UTC存储和计算
- 前端根据用户时区格式化显示
- 使用成熟的时区库(如 Java 的 java.time、Python 的 zoneinfo、JavaScript 的 Intl)
- 日志中显式标注时区
结语
“存UTC、显示本地”是时间处理的金科玉律。掌握它,能让你远离大部分与时间相关的疑难杂症。