Django datetimefield timezone aware CET

时间:2016-01-29 12:05:18

标签: python sqlite django-models django-timezone

我看过这篇文章Is Django corrupting timezone-aware DateTimeField when saving it to the Database?,但是它专门使用了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()

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

我的django设置说

TIME_ZONE = 'CET'
USE_TZ = True

检索我得到的数据:

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

为什么它以另一种格式存储数据然后我指定为什么如果将D​​jango设置为时区可识别我是否会获得UTC时区?我的意思是在插入之前,datetime对象说:datetime.datetime(2016, 1, 11, 0, 0, tzinfo=<DstTzInfo 'CET' CET+1:00:00 STD>)

更新 -

我在此期间通过在Django文档here中描述的数据库上设置TIME_ZONE找到了解决方法。这为我提供了数据库中正确的时区/日期,但根据该文档,我不需要它,因为我的数据库由Django管理

  

这允许与以当地时间而不是UTC存储日期时间的第三方数据库进行交互。为避免DST更改出现问题,不应为Django管理的数据库设置此选项。

我仍然不清楚为什么Django 将具有CET时区的日期时间对象转换为UTC时将其存储在数据库中,但是不够智能将其转换回CET检索时。

1 个答案:

答案 0 :(得分:4)

Django在内部使用UTC时间。 TIME_ZONE将用于您的观点和模型&#34; (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!您的日期时间已正确保存到数据库并稍后还原,因此一切都按预期工作。