【问题标题】:How to get local datetime from django model DateTimeField?如何从 django 模型 DateTimeField 获取本地日期时间?
【发布时间】:2016-03-08 22:43:03
【问题描述】:

我设置了USE_TZ = TrueTIME_ZONE

当我用时区对象添加datetime 时,它只存储UTC 时间,即使我使用本地datetime tzinfo

之后,当我得到带有本地时区的日期时间时,它仍然返回 UTC 日期时间。

我的问题是

首先 有没有办法从 django 模型而不是 utc 获取本地(settings.TIME_ZONEdatetime

我知道如果我调用 timezone.localtime(..) 可以做到,但我希望 Django 自动返回本地时间。

这意味着ModelClass.objects.get(..).datetimeColunm返回本地datetimeobject而不是utc。

第二 有什么方法可以更改 Django 中的数据库会话时区? 我想如果我可以在 Django 中更改 DB 会话时区,我可以获得本地时间 datetime 对象,因为 DB 将本地 datetime 返回给 Django。

【问题讨论】:

    标签: python django datetime oracle11g timezone


    【解决方案1】:

    您可以在三个位置控制日期时间字段的时区(假设为USE_TZ = True):

    • 如果您的数据库不支持时区(即不是 PostgreSQL),您可以使用 database TIME_ZONE setting 设置将用于存储和检索日期时间的时区。

      李>
    • 您的数据库或数据库适配器可能具有允许您基于每个连接控制时区的设置。 (也就是说,它不影响日期时间的存储,它只是返回数据的转换。) Django 不会更改从数据库适配器返回的值,所以如果它不是 UTC,Django 将离开它那样。

    • 您可以在 Django 中执行一些操作来自动将返回的 UTC 日期时间转换为 TIME_ZONE

    根据您希望解决方案的通用性,有几种可能的方法可以在 Django 中进行转换。例如,如果您只是要访问单个实例上的字段,则可以使用其他模型方法或属性(例如 model.datetimeColumnTz())。

    最通用的方法是创建一个自定义模型字段,该字段返回您想要的时区中的日期时间。这是未经测试的,但这样的事情应该可以工作:

    class DateTimeFieldTz(models.DateTimeField):
    
        def from_db_value(self, value, expression, connection, context):
            if value is None:
                return None
            else:
                return django.utils.timezone.localtime(value)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 2015-12-05
      • 2013-07-12
      • 1970-01-01
      相关资源
      最近更新 更多