【发布时间】: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 |
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
问题
- 如何在不进行任何转换的情况下直接获取可识别时区的日期时间对象?
- 还是需要手动转换?
【问题讨论】:
-
这是不寻常的行为,所以我假设您的应用程序或数据库在某个时候发生了变化?你能用一个新的数据库复制这个吗?另外,请为您的示例 (
pk=1) 显示实际的数据库值(不是 Python 对象)。
标签: python django datetime timezone