我看到这篇文章是 Django 在将其保存到数据库时破坏了时区感知的 DateTimeField 吗?但它专门使用 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>)
更新——
同时,我通过按照此处TIME_ZONE
的 Django 文档中所述 设置数据库找到了解决方法。这为我提供了数据库中正确的时区/日期,但根据该文档,我不应该需要它,因为我的数据库由Django 管理
这允许与以本地时间而不是 UTC 存储日期时间的第三方数据库进行交互。为避免有关 DST 更改的问题,您不应为 Django 管理的数据库设置此选项。
我仍然不清楚为什么 Django在将具有 CET 时区的日期时间对象存储在数据库中时确实将其转换为 UTC,但在检索时却不够聪明以将其转换回 CET 。