Django datetimefield 时区感知 CET

Django datetimefield timezone aware CET

我看到了这个 post 但它专门使用了 pytz 和 mysql 而不是我不使用 pytz 和使用 SQLite 的地方(以防它可能有影响) .

我有以下型号

class ScheduleItem(models.Model):
    work_date = models.DateTimeField('Work date')

然后我插入数据如下:

from isoweek import Week
from dateutil import parser
from django.utils import timezone

def foo()
    year = 2016 #hardcoded for example purpose
    wknr = 2 #hardcoded for example purpose
    dateObj = parser.parse(Week(year, wknr).day(0).isoformat() + " 00:00:00")
    print(dateObj) # 2016-01-11 00:00:00 as expected
    final = timezone.make_aware(dateObj)
    print(final) # 2016-01-11 00:00:00+01:00 as expected
    return final


workdate = foo()
si = ScheduleItem(work_date=workdate)
si.save()

打印语句给我正确的输出,但是一旦我查看数据库 (SQLite),我就会看到 2016-01-10 23:00:00

我的 django 设置说

TIME_ZONE = 'CET'
USE_TZ = True

检索我得到的数据:

datetime.datetime(2016, 1, 10, 23, 0, tzinfo=<UTC>)

为什么它以另一种格式存储数据,然后我指定,为什么如果 Django 设置为时区感知,我会得到一个 UTC 时区?我的意思是在插入日期时间对象之前说:datetime.datetime(2016, 1, 11, 0, 0, tzinfo=<DstTzInfo 'CET' CET+1:00:00 STD>)

更新 -

我同时找到了解决方法,如 Django 文档 here 中所述,在数据库上设置 TIME_ZONE。这给了我数据库中的权利 timezone/date,但根据该文档我不需要它,因为我的数据库 是由 Django

管理的

This allows interacting with third-party databases that store datetimes in local time rather than UTC. To avoid issues around DST changes, you shouldn’t set this option for databases managed by Django.

我仍然不清楚为什么 Django 确实 将具有 CET 时区的 datetime 对象存储在数据库中时转换为 UTC,但不够智能,无法转换它检索时返回CET。

Django 在内部使用 UTC 时间。 TIME_ZONE 将被使用 "for your views and models" (https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-TIME_ZONE)

您从 2016-01-11 00:00 CET 开始,即 2016-01-10 23:00 UTC!您的日期时间已正确保存到数据库并随后恢复,因此一切都按预期工作。