django的时区配置

此处使用的django是4.0版本,早期版本可能用法不一样,请注意斟酌

1. 重要的两个配置

time_zone:django级别的时区配置。会影响datetime,time,以及与数据库连接的时区。且windows与unix系统不一样
use_tz: 是否开启时区感知。我一般使用False

2. 细节补充

time_zone
注意: Django 无法在 Windows 环境下可靠地使用交替时区。如果你在 Windows 上运行 Django, TIME_ZONE 必须设置为与系统时区匹配。

下面所说均认为是unix环境(use_tz=False的情况)
1. 在 Unix 环境下(实现了 time.tzset()),Django 将 os.environ['TZ'] 变量设置为你在 TIME_ZONE 配置中指定的时区。这样,你所有的视图和模型都会自动在这个时区运行。
但是,如果你使用的是 手动设置配置 中描述的手动配置选项,Django 就不会设置 TZ 环境变量。如果 Django 没有设置 TZ 环境变量,那么就需要你确保你的进程运行在正确的环境中。
2. 具体表现为,datetime.datetime.now的值是不带时区的,但是会与time_zone的配置不同而获取到不同的时间。
比如当前时间为UTC 00:00,如果time_zone配置为UTC,datetime.datetime.now获取到的值就是00:00,但是如果time_zone配置为Asia/Shanghai,
获取到的值就是08:00,同一行代码会因为此配置的不同导致不同的结果。(time方法同理) 3. 对于数据库的影响:因为有些数据库不支持时区,此处均指pg数据库(mysql没有时区)。
django作为客户端连接数据库时,使用的时区是与time_zone保持一致的(use_tz=False时。如果use_tz=True,时区需要再数据库配置中添加time_zone(注意,这个是数据库连接配置参数,在DATABASE中添加,不是django配置),才可以指定返回的时区)。
django在使用pg数据库时,建立的日期时间字段都是默认带有时区的。django在use_tz=False时,在操作数据库的时间字段时,会将当前时间(没有时区的时间)自动转换成UTC时间。
例如:当前UTC时间00:00,time_zone配置为Asia/Shanghai使用datetime.now获取的时间是:08:00,插入数据库时,会被转换成00:00(目前测下来是这样的,数据库是UTC时区)

 

posted @ 2026-06-23 11:26  10132714  阅读(2)  评论(0)    收藏  举报