【问题标题】:Django treating DateTimeField as both UTC and America/ChicagoDjango 将 DateTimeField 视为 UTC 和 America/Chicago
【发布时间】:2020-04-08 15:46:01
【问题描述】:

在我的 views.py 中,我正在写入和读取具有 DateTimeField 的 PostgreSQL 表。

创建新条目时,日期字段以 UTC 时间填充。当从 views.py 中的数据库中提取数据时,UTC 时间戳被视为位于“美国/芝加哥”时区。

# settings.py
TIME_ZONE = 'America/Chicago'
USE_I18N = True
USE_L10N = True
USE_TZ = True

我尝试在数据库中创建条目时提供各种时区感知日期,但在直接查看数据库时它始终显示为 UTC。当我拉回数据时,django 将 UTC 日期时间视为时区是“美国/芝加哥”

# views.py
    CT = pytz.timezone("America/Chicago")
    UTC = pytz.timezone("UTC")
    # attempt_1 = datetime.datetime.utcnow().astimezone(CT)
    # attempt_2 = datetime.datetime.now().astimezone(CT)
    # attempt_3 = datetime.datetime.utcnow()
    attempt_4 = datetime.datetime.utcnow().astimezone(UTC)
    new_entry = MyModel(date=attempt_4)
    new_entry.save()

【问题讨论】:

    标签: python django postgresql


    【解决方案1】:

    出现问题是因为我的 DateTimeField 在 models.py 中定义如下:

    date=models.DateTimeField(auto_now_add=True)

    创建新条目时,日期字段按照文档here 的预期填充为UTC 时间。

    auto_now_add 将在首次创建对象时自动将该字段设置为 now。用于创建时间戳。请注意,始终使用当前日期;它不仅仅是您可以覆盖的默认值。所以即使你在创建对象的时候给这个字段设置了值,它也会被忽略。

    如果 USE_TZ 为 True,这将是一个可感知的日期时间,以 UTC 表示当前时间。请注意,无论 TIME_ZONE 的值如何,now() 都将始终返回 UTC 时间;您可以使用 localtime() 来获取当前时区的时间。 is_aware(值)

    我最终通过在 settings.py 中更改 TIME_ZONE = 'UTC' 解决了我的问题。尽管根据文档显示,您也可以更改 models.py 并在没有 auto_now_add 的情况下定义日期,如下所示:

    date=models.DateTimeField()

    【讨论】:

      【解决方案2】:

      听起来它的工作方式与Time zones Django 文档中的预期完全一样:

      启用时区支持后,Django 以 UTC 格式将日期时间信息存储在数据库中,在内部使用可识别时区的日期时间对象,并在模板和表单中将它们转换为最终用户的时区。

      您应该使用 django 的时区模块作为您的日期。

      from django.utils import timezone
      
      now = timezone.now()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-30
        • 2015-09-27
        • 2012-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多