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
所以,我绝对不明白发生了什么。我的错误在哪里?
答案 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点(第二天)。