【问题标题】:Migrate datetime w. timezone in PostgreSQL to UTC timezone to use Django 1.4迁移日期时间 w。将 PostgreSQL 中的时区转换为 UTC 时区以使用 Django 1.4
【发布时间】:2012-05-14 18:41:49
【问题描述】:

我是否需要将 Postgres 中的所有现有日期时间从其当前时区转换为 UTC,或者 Django 1.4 时区在读取非 UTC(但随后保存为 UTC)时是否能理解。

我有一个非常好用的 Django 1.3/Postgres 网站,我可以在其中处理多个时区。我正在存储所有日期时间 w。时区信息,但这恰好在 Postgres 中设置为美国/东部时区(是的,我知道应该是 UTC)。

现在,我计划升级到 Django 1.4 并计划在那里使用 Django 时区支持。据我了解,它将UTC中的所有日期时间保存到数据库中,这很好,但是我所有现有的时区设置但不设置为UTC的信息呢?

有没有人按照这个迁移过,它是如何工作的,感觉要么我完全没有问题,要么我需要迁移大量的日期时间数据。

【问题讨论】:

    标签: django postgresql datetime migration timezone


    【解决方案1】:

    我正在存储所有日期时间 w。时区信息,但这恰好是设置的 在 Postgres 中到美国/东部时区(是的,我知道应该是 UTC)。

    这里有几个误解。

    该数据类型在 PostgreSQL 中称为timestamp。没有称为“日期时间”的类型。
    timestamptimestamp without time zone 的缩写。
    timestamptztimestamp with time zone 的缩写。

    如手册所述:

    timestamp 值存储为 2000-01-01 午夜之前或之后的秒数。

    类似于 Posix 时间,该时间从 30 年前的 Unix epoch 1970-01-01 00:00 UTC 开始。对于timestamp,假定为本地2000-01-01 00:00。对于timestamptz,引用为2000-01-01 00:00 UTC,显示会根据当前会话在输入和输出上的时区偏移进行调整。

    timestamp with time zone 存储一个唯一的时间点。您不能在内部将时间戳(带或不带时区)“设置”为 UTC 以外的任何其他时区。时区偏移量本身没有保存。它仅用于将输入/输出调整为 UTC。

    时间戳值的表示考虑了当前会话的时区设置。

    • 相应地显示值(输出)。
    • 正确解释timestamp without time zone(输入)。

    好消息:您的迁移应该开箱即用 - 只要您不主动搞砸。

    Postgres 时间戳如何用示例和链接详细解释:

    示例查询

    尝试以下语句(一次一个块)。也可以在您的专栏中尝试一下:

    SHOW timezone;
    
    SELECT '2011-05-24 11:17:11.533479-05'::timestamptz(0);
    SELECT '2011-05-24 11:17:11-05'::timestamptz;
    
    SET timezone='UTC';
    SELECT '2011-05-24 11:17-05'::timestamptz;
    
    SELECT '2011-05-24 11:17-05'::timestamptz AT TIME ZONE 'UTC';
    
    SELECT '2011-05-24 11:17-05'::timestamptz AT TIME ZONE 'UTC' AT TIME ZONE 'UTC';
    
    RESET timezone;
    

    【讨论】:

    • 正确,我的一些措辞是错误的。当我使用 Web 界面浏览 Postgress 中的数据时,我看到了我的时间戳 w。 tz as '2011-05-24 11:17:11.533479-05' 我认为 -05 中的最后一部分显示了偏移量,因此它不存储在 UTC 中(或者这只是适应我的事实的网络界面我登录了,我的 tz 是 -05'?
    • @JensLundstrom:时区偏移甚至没有保存。您看到的是根据当地时区设置的显示。我添加了一些查询来说明。
    • 别忘了,当您升级到 1.4 时,您必须设置 USE_TZ = True 才能启动新行为!
    • 是的,已经做到了。我还在为一些装饰器运行 django-timezones,到目前为止,一切测试都正常。对于其他进行此迁移的人; (i) 检查代码并用 django utils now() 替换 datetime.datetime.now() 和 (ii) 对设置或比较日期和时间的任何内容进行一些冒烟测试,我有更多天真的日期时间事件然后我想。
    猜你喜欢
    • 2023-03-10
    • 2021-03-12
    • 1970-01-01
    • 2016-06-17
    • 2022-12-17
    • 2012-08-02
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多