Django和时区

时间:2014-10-25 01:16:03

标签: python django datetime pytz

Django 1.7,PostgreSQL。

我想以UTC格式存储日期时间并将其显示在PST时区。

我当地时间:上午8:05

UTC时间:凌晨1点05分

太平洋标准时间:下午6:05

Django doc:

When support for time zones is enabled, Django stores date and time 
information in UTC in the database, uses time-zone-aware datetime objects 
internally, and translates them to the end user’s time zone in templates 
and forms.

setting.py

USE_TZ = True
TIME_ZONE = 'US/Pacific'

模型字段

created_at = models.DateTimeField(auto_now_add=True)

我创建了新模型,在django admin中显示PST时间(下午6:05)。没关系。但如果我这样做:

select created_at from my_table where id = 1;

显示我当地时间(上午8:05)!所以,我不确定这是以UTC时间存储的。

还有一件事。

通常的日期时间字段,我已设置管理员此日期:2014-10-25 18:00:00

ID显示在管理员10月 25 ,2014年,下午6点。

但是从DB中选择显示我:

2014-10- 26 08:00:00.0

所以,我绝对不明白发生了什么。我的错误在哪里?

2 个答案:

答案 0 :(得分:6)

基本上发生的事情是时间使用时间戳存储在数据库中,但是使用数据库中指定的时区显示时间,除非手动更改时间是机器的时区。但是由于你在django中指定了一个不同的时区,django会调整差异。因此,您需要做的是将db中的时区更改为UTC(进程因引擎而异)

我喜欢这样做的方法是保持数据库时区不变,在django设置中指定'UTC',然后每当向用户显示时间时,使用一些javascript将其转换为本地用户时间。

修改

之前没有注意到你正在使用PostgreSQL。我想你可以在postgresql.conf中更改时区或在数据库中将TimeZone变量更改为UTC

答案 1 :(得分:1)

我认为Alexey Kuleshevich回答了问题的第一部分:当您执行手册select时,PostgreSQL会在数据库中配置的时区中显示时间戳。但是,这并没有影响Django,这符合文档的行为。

至于问题的第二部分:当您在表单中输入日期时间值时,Django会在当前时区中对其进行解释,默认情况下与您的{{1}相同} 设置。因此,当您在管理员中输入下午6点时,Django会将其解释为太平洋标准时间下午6点,并将其存储为UTC时间凌晨1点(第二天)。然后数据库显示为当地时间早上8点(第二天)。