Django 和时区设置的问题
written on Wednesday, August 19, 2009
Django 1.1 及其之前的版本, 时区处理这一块算是比较混乱的了:
- 依赖数据库管理系统本身 (Django 针对 PostgreSQL 做了特殊处理)
- 跨平台能力弱 (Python 标准库的 TZ 环境变量依赖 *nix 操作系统)
- Windows 下, settings.TIME_ZONE 的值直接被忽略, Django 将使用系统默认本地时间
- settings.TIME_ZONE 推荐的值本身缺乏可移植性, 至少在 Webfaction 提供的 Linux 主机中, 无法识别推荐的 'Asia/Shanghai PRC' 时区, 设置为 'Asia/Shanghai' 则正常
- 没有提供一个统一的时区 API 和相关 Filter, 导致不同 app 在时区处理处于各自为政的状态, 有的是将 UTC 时间存入数据库, 有的则把本地时间存入数据库
- 单一的时区设置 -- 多用户模式下, 不支持用户自定义时区
相关的 Bug 报告:
- Timezone bug in development server using a Windows environment
- Datetime handling is broken when dealing with more than one time zone
相关研究:
- Fun with timezones in Django & MySQL
- TIME_ZONE setting: How does it work?
规避
大部分情况下, 都不太需要更改本地时区, Django 当初设计的时可能也是这么考虑的.
但是, 使用本地时间存数据库显然是缺乏灵活性的. 尤其是美国, 采用多个时区不说, 根据夏令/冬令时段还会调整时间.
Bug #2626 表明 Django 正在努力改进时区处理. 但在 Django 完成改进之前, 新开发的 app, 在不考虑多用户的情况下, 最好是: 把 UTC 时间存入数据库, 前台 view 或 template 再根据设置的显示时区呈现, 尽可能使用 pytz.
参考: Google App Engine 中通过自定义Django的filter解决时区问题
多用户的情况
如果应用是国际化的, 用户地域分布广, 目前 Django 的时区处理功能还无法满足, 需要借助第三方 app : django-timezones