Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django为什么创建带有时区的Postgres时间戳列?_Python_Django_Postgresql_Datetime_Timezone - Fatal编程技术网

Python Django为什么创建带有时区的Postgres时间戳列?

Python Django为什么创建带有时区的Postgres时间戳列?,python,django,postgresql,datetime,timezone,Python,Django,Postgresql,Datetime,Timezone,我认为Django创建的datetime列与时区无关,但当我查看我的Postgres表时,我发现记录在那里的值包含时区信息 更进一步,我发现Postgres后端指示Django创建使用时区的列 从django/db/backends/postgresql/creation.py: data_types = { ... 'DateTimeField': 'timestamp with time zone', ... 模式显示创建的列被指定为

我认为Django创建的datetime列与时区无关,但当我查看我的Postgres表时,我发现记录在那里的值包含时区信息

更进一步,我发现Postgres后端指示Django创建使用时区的列

从django/db/backends/postgresql/creation.py:

data_types = {
        ...
        'DateTimeField':     'timestamp with time zone',
        ...
模式显示创建的列被指定为“带时区的时间戳”

Postgres日志显示发送的update语句。Django构造了一条SQL语句,按照Django设置文件的指示,使用UTC作为时区

UPDATE "notification_notice" SET "sender_id" = 1, "group_id" = NULL, "notice_type_id" = 1, "content_type_id" = 21, "object_id" = 3, "created" = E'2011-11-11 22:31:08.022148' WHERE "notification_notice"."id" = 14
这就是我的桌子的样子。创建的列有一个时区为“-08”的timestame。Postgres必须检查我的系统时钟的时区才能找到时区

CREATE TABLE notification_notice
(
  ...
  created timestamp with time zone NOT NULL,
  ...
my_db=# select * from notification_notice limit 1;
 id | sender_id | group_id | notice_type_id | content_type_id | object_id |           created            | last_interaction_time 
----+-----------+----------+----------------+-----------------+-----------+------------------------------+-----------------------
  1 |           |        3 |             21 |              53 |         6 | 2011-11-11 14:31:02.98882-08 | 
(1 row)
问题:
Django对时区不采取干预政策吗?
为什么Postgres后端对models.DateTimeField使用时区?这是博士后的要求吗?

有没有办法强迫Django在不使用时区的Postgres中创建时间戳列

坏消息是问题的根源在于Python的datetime实现

好消息是,Django在这个问题上有自己的想法

坏消息是这张票是2006年开的

好消息是,a是更有用的阅读,而且似乎正在发展中。包含提案的线索很长,但信息量很大

坏消息是,该提案归结为“这真是一团糟”。(尽管如此,它仍在开发中。)

更进一步,我发现Postgres后端将Django引导到 创建使用时区的列

不,这是Django的设计决定。PostgreSQL只存储UTC;它不存储时区,也不存储偏移量。时区在概念上类似于一个环境变量,在插入或选择时间戳进行检索时应用于时间戳

在数据库中没有实际时区支持的情况下,任何操作 被django带走会给某人带来不便,而且很可能 与同一数据库的非django使用不兼容

这是一个大问题——可能会使数据库与其他语言或框架不兼容的修复。在我工作的地方,那绝对是一场表演;许多编程语言和框架访问数据库


SQLite、Microsoft Access和MySQL(日期时间数据类型,而不是时间戳)在该线程中被引用为数据库中缺少时区支持。

Postgresql能够存储时区的时间戳是一件好事。时间戳应该代表一个时间点。如果您阅读“2013-03-15 14:38:00”,您是否能够准确了解所代表的时间点?不纽约可能是14:38,柏林可能是14:38,这是两个不同的时间点。因此,除非隐含特定的时区(例如UTC),否则绝对不应该有没有时区的时间戳(它们被称为“原始”日期时间)

在我看来,Django创建带有时区的时间戳是一件好事。您可以通过重写默认行为,但我不推荐这样做,除非您有很好的理由去掉数据库中的时区(例如,因为它破坏了其他遗留程序)

如果使用Django<1.4,则postgresql客户端代码假定所有日期时间都在系统的时区内。因此,如果django服务器的时区是柏林,那么“2013-03-15 14:38:00”将被解释为柏林时区的14:38,所有这些信息都将存储在数据库中。如果删除时区信息,则在时间更改时会出现问题。例如,“2013-10-26 02:30:00”是不明确的:是第一次还是第二次出现在凌晨2:30?如果您这样做,则必须在Django代码中将所有日期时间转换为UTC,并将UTC日期时间存储在数据库中

如果您使用Django>=1.4,那么默认情况下它是时区感知的,并且希望每个datetime都有一个时区。由于python datetimes在默认情况下没有时区,因此您应该使用确保您操作的每个datetime都是时区感知的


这本书读得很好。

我认为你的假设不正确

对于带有时区的时间戳,内部存储的
值始终为UTC(通用协调时间,传统上称为格林威治标准时间,GMT)。指定了明确时区的输入值将使用该时区的适当偏移量转换为UTC。如果输入字符串中未说明时区,则假定它位于系统时区参数指示的时区中,并使用时区的偏移量转换为UTC

因此实际上,时区信息丢失了。但是时间的瞬间被保留了下来


这意味着,当您获得时间戳信息时,无论您或您的服务器当前处于哪个时区,都将始终是正确的。对于大多数应用程序,这正是您想要的。

可能的答案:是的,我知道这是Django设计描述。我所说的“Postgres后端”是指Django ORM的Postgres后端。如果时区像一个环境变量,那么这是否意味着我只需要在数据库连接中设置时区(例如UTC)?@hekevintran:我还在(再次)阅读我发布的那些参考资料。当我使用时区和多个应用程序时,突然我的名字叫“爱丽丝”,我陷入了困境:我不再确定我知道什么和不知道什么。我要说“不”,因为您的Django应用程序在存储时间戳之前仍然需要将每个时间戳标准化为UTC。他们中的每一个人,永远。我也会说“不”,因为我很确定这是真的