时区处理:最佳实践
正确的时区处理对于全球应用程序至关重要。遵循这些最佳实践以避免常见陷阱。
始终以 UTC 存储
最佳实践:在数据库中将时间戳存储为 UTC。仅在显示时转换为本地时区。 为什么? - 跨时区的一致性 - 简化的日期算术 - 避免夏令时混淆 - 更容易调试 数据库:使用 TIMESTAMP 或 INTEGER(用于 Unix 时间戳)。 应用程序:在内部以 UTC 工作。仅在 UI 层转换。
使用可靠的时区库
切勿滚动您自己的时区逻辑。使用维护良好的库: JavaScript:Intl.DateTimeFormat(内置)、date-fns-tz、Day.js(使用时区插件) Python:pytz、dateutil Java:java.time(Java 8+) PHP:DateTimeZone 这些库处理:夏令时转换、历史时区规则、闰秒(如果需要)、边缘情况(不存在/模糊的本地时间)。 保持库更新——时区规则会更改!
处理夏令时
夏令时创建边缘情况: 春季向前:某些本地时间不存在(凌晨 2:00 → 凌晨 3:00) 秋季向后:某些本地时间重复两次(凌晨 2:00 发生两次) 可靠的库自动处理这个问题。对于用户输入: - 使用日期时间选择器,避免歧义 - 显示明确的时区信息 - 测试 DST 转换周围的边缘情况 切勿假设"添加 1 天 = 添加 24 小时"。在 DST 转换期间,一天可能是 23 或 25 小时。
显示给用户
当向用户显示时间时: 检测用户的时区: - 浏览器:Intl.DateTimeFormat().resolvedOptions().timeZone - 服务器:用户配置文件设置、IP 地理位置(不太可靠) 格式化为本地时间: - 使用用户的地区设置首选项(MM/DD/YYYY vs DD/MM/YYYY) - 显示时区缩写(EST、PST)或偏移量(UTC-5) - 对于相对时间使用友好格式("2 小时前") 始终提供绝对时间的方式(悬停工具提示显示完整的日期时间 + 时区)。
试用工具
时间戳转换器