为什么django DateTimeField
将datetime
中的tzinfo
还原为<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
请务必阅读Django的时区文档。该方法在第一句话中简洁地说明:
当支持时区时,Django将UTC格式的日期时间信息存储在数据库中,在内部使用时区感知的日期时间对象,并在模板和表单中将其转换为最终用户的时区。
所以,是的,从数据库中看到UTC的返回值是正常的。
至于为什么,文档说明:
即使您的网站只在一个时区可用,在数据库中以UTC存储数据仍然是一个好做法。主要原因是日光节约时间(DST)。许多国家都有夏令时制度,在春天把时钟拨快,在秋天把时钟拨慢。如果您使用的是本地时间,那么当转换发生时,您可能每年会遇到两次错误。
它还链接到pytz
文档中更详细的描述。