构建时区支持应用的最佳实践
我正在开发一个支持时区的网页应用,想了解一些最佳实践。
比如说,有用户A和用户B,他们各自设置了自己的时区。用户A输入了一个时间(在他的时区下)。那么我该如何把这个时间存储到数据库里呢?
- [选项1] 存储原始时间和原始时区
- [选项2] 将时间转换为协调世界时(UTC)并存储为UTC时间。
使用场景包括:
- 用户A需要看到这个时间。
- 用户B也需要看到这个时间。
- 匿名用户需要看到这个时间。
- 需要计算时区之间的差异。
我能看到这两种方法各自的优点。我并不是特别想要这个问题的答案,而是想了解更多关于如何构建支持时区的网页应用的信息。
我使用的是Python,但也希望能得到一些与语言无关的建议。
2 个回答
2
一般来说,我觉得把时间转换成统一的格式(UTC)来存储更合理,然后在显示的时候再转换成用户自己的时区。你可以根据匿名用户的IP地址来猜测他们的时区,或者默认设置一个可能的时区。
当然,这也要看你在做什么。对于很多事情来说,绝对的时间是很重要的:比如说,如果有视频会议,它的开始时间在每个时区都得是一样的。但也有一些情况是按当地时间来处理的。比如地球一小时,在每个时区都是晚上8点半到9点半。
4
从语义上讲,你处理的几乎所有时间都是绝对时间(比如:账单、创建和修改时间、最后一次查看、API 限制、Stack Overflow 的悬赏等等)。这些时间应该以 UTC(协调世界时)存储,这样就不会产生歧义。否则,当某个国家政府改变夏令时规则时,你系统里的时间规则更新了,你存储的值就会改变其含义。
如果这个时间还涉及到具体的时间和地点(比如会议、日历安排等),你可以按照 RFC 3339 的格式存储完整的符号日期,包括时区名称(这和 UTC 偏移量是不一样的),并在需要的时候转换为 UTC。