Django DateTimeField存储datetime而不管tzinfo

时间:2015-10-22 11:39:20

标签: python django datetime timezone python-datetime

为什么django DateTimeFieldtzinfo中的datetime还原为<utc>

以下是我的测试代码。

是正常还是错误。?

如果是正常的,原因是什么?

models.py
class Date(models.Model):
  datetime = models.DateTimeField()


settings.py
TIME_ZONE = 'Asia/Seoul'
USE_TZ = True


test.py
from django.utils import timezone

datetime = timezone.localtime(timezone.localtimezone.now())
#now datetime is datetime.datetime(2015, 10, 22, 20, 31, 56, 248000, tzinfo=<DstTzInfo 'Asia/Seoul' KST+9:00:00 STD>)

models.Date(datetime=datetime).save()
#If I check datebase, It shows 2015-10-22 11:31:56.248000

model.Date.object.get(..)
#It returns datetime.datetime(2015, 10, 22, 11, 31, 56, 248000, tzinfo=<UTC>)

我希望django存储2015-10-22 20:31:56.248000并返回datetime.datetime(2015, 10, 22, 20, 31, 56, 248000, tzinfo=<DstTzInfo 'Asia/Seoul' KST+9:00:00 STD>)

-------------- ----------------编辑

我使用了Sqlite

1 个答案:

答案 0 :(得分:3)

请务必阅读Django's timezone documentation。第一句话简明扼要地阐述了这种方法:

  

当启用对时区的支持时, Django将日期时间信息以UTC格式存储在数据库中,在内部使用时区感知日期时间对象,并将它们转换为模板中最终用户的时区和形式。

所以,是的,从UTC中看到数据库的返回值是正常的。

至于原因,文件说明:

  

即使您的网站仅在一个时区可用,在数据库中以UTC格式存储数据仍然是一种很好的做法。主要原因是夏令时(DST)。许多国家都有DST系统,其中时钟在春季向前移动,在秋季向后移动。如果你在当地工作,那么当转换发生时,你可能每年会遇到两次错误。

它还会链接到pytz文档中的a more detailed description