一尘不染

Django DateTimeField存储日期时间,与tzinfo无关

python

为什么Django的DateTimeField恢复tzinfodatetime,以<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


阅读 326

收藏
2021-01-20

共1个答案

一尘不染

确保阅读Django的时区文档。在第一句话中简要说明了该方法:

启用时区支持后, Django将日期时间信息存储在数据库中的UTC中,在
内部使用可识别时区的日期时间对象,并将其以模板和形式转换为最终用户的时区。

因此,是的,在UTC中看到数据库的返回值是正常的。

至于原因,文档指出:

即使您的网站仅在一个时区中可用,将数据存储在数据库中的UTC中仍然是一种好习惯。主要原因是夏令时(DST)。许多国家/地区采用夏令时制,时钟在春季向前移动,在秋季向后移动。如果您在当地时间工作,那么转换时每年可能会遇到两次错误。

网站还链接了更详细的描述pytz的文档。

2021-01-20