【问题标题】:Django Timezone ConfigurationDjango 时区配置
【发布时间】:2021-06-09 01:39:12
【问题描述】:

我的 django 项目在设置中正确启用了时区。

然而,Django ORM 对象的 datetime 字段是一个幼稚的 datetime 对象,如块 3 所示。

预期的结果应该与 Block 4 的输出相同,无需任何手动转换。

In [1]: from django.conf import settings
   ...: settings.USE_TZ, settings.TIME_ZONE
Out[1]: (True, 'Asia/Hong_Kong')

In [2]: from qms.models import Quota

In [3]: q = Quota.objects.get(pk=1)
   ...: q.create_date, q.write_date
Out[3]:
(datetime.datetime(2021, 3, 10, 17, 37, 42, 489818),
 datetime.datetime(2021, 3, 10, 17, 37, 42, 489818))

In [4]: from django.utils import timezone
   ...: timezone.make_aware(q.create_date,timezone.utc), \
   ...: timezone.make_aware(q.write_date, timezone.utc)
Out[4]:
(datetime.datetime(2021, 3, 10, 17, 37, 42, 489818, tzinfo=<UTC>),
 datetime.datetime(2021, 3, 10, 17, 37, 42, 489818, tzinfo=<UTC>))

用 SQL 记录

Column value
id 1
create_date 2021-03-10 17:37:42.489818+00
write_date 2021-03-10 17:37:42.489818+00
name email

Django 模型定义

class Quota(models.models):
    name = models.CharField(max_length=255)
    create_date = models.DateTimeField(auto_now_add=True)
    write_date = models.DateTimeField(auto_now=True)

PostgreSQL 数据库架构和设置,表“public.qms_quota”

Column Type Modifiers
id integer not null default nextval('qms_quota_id_seq'::regclass)
create_date timestamp with time zone not null
write_date timestamp with time zone not null
name character varying(255) not null
SHOW TIMEZONE;
 TimeZone
----------
 UTC

问题

  1. 如何在不进行任何转换的情况下直接获取可识别时区的日期时间对象?
  2. 还是需要手动转换?

【问题讨论】:

  • 这是不寻常的行为,所以我假设您的应用程序或数据库在某个时候发生了变化?你能用一个新的数据库复制这个吗?另外,请为您的示例 (pk=1) 显示实际的数据库值(不是 Python 对象)。

标签: python django datetime timezone


【解决方案1】:

根本原因是来自连接池库django_postgrespool2==2.0.1 的错误。

当您将连接引擎与“django_postgrespool2”一起使用时,它不会正确处理时区设置。 Releated Issue

TLDR:使用引擎django.db.backends.postgresql

【讨论】:

    【解决方案2】:

    您可以使用django.utils.timezone.localtime 将从数据库接收到的日期时间转换为本地时间:

    from django.utils.timezone import localtime
    q = Quota.objects.get(pk=1)
    print(localtime(q.create_date), localtime(q.write_date))
    

    【讨论】:

    • 我想在不进行任何转换的情况下获取可感知的日期时间对象
    猜你喜欢
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2014-10-18
    • 2023-03-11
    • 2013-08-15
    • 2014-12-08
    • 2018-07-21
    相关资源
    最近更新 更多