【问题标题】:django converting old datetime field to new 1.4 datetime with time zone aware in SQLitedjango 将旧的日期时间字段转换为新的 1.4 日期时间,在 SQLite 中具有时区意识
【发布时间】:2012-04-05 19:29:34
【问题描述】:

我有一个 django 1.3 项目,我正在添加将按特定时间表运行的文本通知。因此,我需要该应用程序能够感知时区。看起来 django 1.4 处理得很好。问题是我使用 SQLite for db,它不存储时区信息,所以我必须转换。我是 django 新手。关于如何将 SQLlite 中的日期时间字段转换为时区感知字段的任何建议。

顺便说一句,当我在升级到 django 1.4 并激活时区支持后启动 manage.py shell 时,我收到以下消息:

RuntimeWarning: SQLite received a naive datetime (2012-04-05 15:18:49.939725) while 
time zone support is active. RuntimeWarning)

谢谢!

【问题讨论】:

标签: django django-models


【解决方案1】:

您不会将 SQlite 中的日期时间字段转换为可识别时区的字段。在 SQlite 中,日期时间仍然是幼稚的,但会转换为 UTC。并且可以在应用程序级别使用时区感知日期时间。

例如,当您从 SQlite 查询具有日期时间字段的模型实例时,Django:

  1. 从 SQLite 获取原始日期时间,将其设置为具有 UTC 时区的感知日期时间
  2. 那么当您访问 model_instance.datetime_field 时,它已经可以识别时区并本地化为 UTC
  3. 然后在模板中,例如,您可以将其本地化到当前时区

编辑:更正了我最初的错误答案,关于你在模型实例上得到了什么。

如果当前 SQlite 数据库中的日期时间不是 UTC,则需要进行一次性迁移以将它们全部转换为 UTC。 (而 UTC 我只是指天真的 UTC 值。作为 SQlite - 以及 MySQL - 没有存储时区信息的日期时间字段)

我建议您非常仔细和彻底地阅读时区相关文档:https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/

这很容易出错。

是的,对于您的代码“提供”天真日期时间给 Django 进行保存的每个实例,您都会得到 RunTimeWarning。您必须逐步修复这些问题,让它们能够感知时区。

【讨论】:

    猜你喜欢
    • 2019-07-21
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多