
django 并不读取系统环境变量 `tz` 来设置时区,而是严格依赖其内部配置项 `time_zone`(默认为 `'america/chicago'`),该设置独立于操作系统级 `tz` 变量,且优先级更高。
在 Django 应用中,你观察到 os.environ.get('TZ') 在普通 Python 脚本中返回预期值(如 'Asia/Shanghai'),但在 Django 运行时却始终显示 'America/Chicago',这并非环境变量被篡改,而是Django 主动覆盖了 TZ 环境变量——这是其时区初始化机制的一部分。
Django 在启动时(具体在 django.utils.timezone._get_default_timezone() 和 django.conf.settings.TIME_ZONE 初始化过程中)会根据 settings.TIME_ZONE 的值,主动设置 os.environ['TZ'],以确保底层 C 库(如 time.tzset())行为与 Django 时区逻辑保持一致。例如:
# settings.py TIME_ZONE = 'Asia/Shanghai' # ← 此配置决定最终生效的 TZ 值
当 TIME_ZONE = 'Asia/Shanghai' 时,Django 启动后执行:
PHP网络编程技术详解由浅入深,全面、系统地介绍了PHP开发技术,并提供了大量实例,供读者实战演练。另外,笔者专门为本书录制了相应的配套教学视频,以帮助读者更好地学习本书内容。这些视频和书中的实例源代码一起收录于配书光盘中。本书共分4篇。第1篇是PHP准备篇,介绍了PHP的优势、开发环境及安装;第2篇是PHP基础篇,介绍了PHP中的常量与变量、运算符与表达式、流程控制以及函数;第3篇是进阶篇,介绍
import os
print(os.environ.get('TZ')) # 输出:'Asia/Shanghai'⚠️ 注意事项:
- 不要依赖 TZ 环境变量作为 Django 时区的“真实来源”——它只是 Django 为兼容 POSIX 时区行为而写入的副作用值;
- 系统级 TZ(如 shell 中 export TZ=UTC)仅在 Django 未启动前 或 非 Django 进程中 有效;
- 若需动态设置时区,请始终通过 settings.TIME_ZONE(推荐硬编码或从 DJANGO_TIME_ZONE 等自定义环境变量加载),而非直接修改 os.environ['TZ'];
- 使用 django.utils.timezone.now() 获取当前时间,它自动适配 TIME_ZONE 设置;避免直接调用 datetime.datetime.now()(它依赖本地时区,可能产生偏差)。
✅ 总结:TZ 在 Django 中是“输出”而非“输入”——它是 TIME_ZONE 配置的镜像,而非源头。排查时区问题,请始终检查 settings.TIME_ZONE,并确保部署环境正确加载该配置(如通过 python manage.py showmigrations 验证配置已生效)。









