Django 和时区设置的问题

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

Add post to:   Delicious Reddit Slashdot Digg Technorati Google

3 Comments

我是前不久才发现django的时区划分好像有点问题,没有标准的北京时间啊,设成Asia/Shanghai会差十分钟左右

关于 Asia/Beijing 时间, 责任倒不在 Django: 电脑时区选择中没有北京的问题

现在大部分软件都开始支持 Asia/Beijing 时区, 其实 Asia/Beijing 和 Asia/Shanghai 是等同的. 你说的问题我没碰到过, 不敢下结论, 到这个网站 http://www.timezoneconverter.com/cgi-bin/zoneinfo.tzc 查时区, 会发现: The Asia/Beijing time zone is an alias for the Asia/Shanghai time zone.

Limodou 碰到过差 6 分钟的情况 — 关于pytz的一些记录(续) 希望能对你有所帮助.

Leave a Reply

Required. 30 chars of fewer.

Required.

captcha image Please, enter symbols, which you see on the image

关于 Yang Yubo

身处 IT 行业, 惯用 C/C++, 对 Python 情有独钟, 平时比较关注 QT / Django / Werkzeug 等. 了解更多 »