Yang Yubo's Life @ Refactoring

Django 和时区设置的问题

written on Wednesday, August 19, 2009

Django 1.1 及其之前的版本, 时区处理这一块算是比较混乱的了:

  1. 依赖数据库管理系统本身 (Django 针对 PostgreSQL 做了特殊处理)
  2. 跨平台能力弱 (Python 标准库的 TZ 环境变量依赖 *nix 操作系统)
  3. Windows 下, settings.TIME_ZONE 的值直接被忽略, Django 将使用系统默认本地时间
  4. settings.TIME_ZONE 推荐的值本身缺乏可移植性, 至少在 Webfaction 提供的 Linux 主机中, 无法识别推荐的 'Asia/Shanghai PRC' 时区, 设置为 'Asia/Shanghai' 则正常
  5. 没有提供一个统一的时区 API 和相关 Filter, 导致不同 app 在时区处理处于各自为政的状态, 有的是将 UTC 时间存入数据库, 有的则把本地时间存入数据库
  6. 单一的时区设置 -- 多用户模式下, 不支持用户自定义时区

相关的 Bug 报告:

相关研究:

规避

大部分情况下, 都不太需要更改本地时区, Django 当初设计的时可能也是这么考虑的.

但是, 使用本地时间存数据库显然是缺乏灵活性的. 尤其是美国, 采用多个时区不说, 根据夏令/冬令时段还会调整时间.

Bug #2626 表明 Django 正在努力改进时区处理. 但在 Django 完成改进之前, 新开发的 app, 在不考虑多用户的情况下, 最好是: 把 UTC 时间存入数据库, 前台 view 或 template 再根据设置的显示时区呈现, 尽可能使用 pytz.

参考: Google App Engine 中通过自定义Django的filter解决时区问题

多用户的情况

如果应用是国际化的, 用户地域分布广, 目前 Django 的时区处理功能还无法满足, 需要借助第三方 app : django-timezones

This entry was tagged Django and Timezone

blog comments powered by Disqus