python - Django datetimefield 时区感知 CET

标签 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()

打印语句给了我正确的输出,但是一旦我查看数据库 (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 文档中描述的数据库上 here .这为我提供了数据库中正确的时区/日期,但根据该文档,我不需要它,因为我的数据库 由 Django 管理

This allows interacting with third-party databases that store datetimes in local time rather than UTC. To avoid issues around DST changes, you shouldn’t set this option for databases managed by Django.

我仍然不清楚为什么 Django 在将带有 CET 时区的日期时间对象存储在数据库中时确实将其转换为 UTC,但在检索时又不够聪明,无法将其转换回 CET .

最佳答案

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

关于python - Django datetimefield 时区感知 CET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35084164/

相关文章:

Django 查询数据库并将数据发送到模板

python - 在列表中查找形成循环引用的 3 对集合

python - Sphinx 将段落标签添加到无序列表项

android - 使用 SimpleCursorAdapter.ViewBinder 改变 TextView 的颜色

c# - DataTable.Load() 未从 ExecuteReader() 获取数据

python - Django表单错误: expected string or bytes-like object for datetime object?

python - 传递单个值而不是列表 django

python - 同时执行多个功能

c - SQLite C 用户定义函数

django - 根据另一个字段的值在Django Admin中将字段设为只读