Django在DateTimeField上的时间不一致

时间:2012-10-31 22:02:45

标签: python django

我有下一个型号:

class People(models.Model):
    name = models.CharField(max_length=100)
    lastname = models.CharField(max_length=100)
    _date=models.DateTimeField()

在views.py

- 当我尝试这个时:

p = People(name='foo', lastname='bar', _date=datetime.now())
p.save()

它返回当前时间:2012-10-31 17:33:10.152323

但是,当我在数据库中检查此记录时,它会显示:

name lastname _date 
foo   bar      2012-10-31 21:33:10

为什么会这样(两个不同的时间)发生?

编辑:(差异为4小时):2012-10-31 17:33:10.152323 and 2012-10-31 21:33:10

2 个答案:

答案 0 :(得分:2)

Django使用时区将DatetimeFields存储到您的数据库中。这就是您在设置中提供TIME_ZONE的原因。

您可以在此处详细了解:https://docs.djangoproject.com/en/dev/topics/i18n/timezones/

如果您想为您的字段提供非天真的日期时间,则必须使用:

now = datetime.utcnow().replace(tzinfo=timezone('Your/Timezone'))

时区可以在这里找到:http://en.wikipedia.org/wiki/List_of_tz_zones_by_name

答案 1 :(得分:1)

即使我也面临着同样的问题。这是因为根据 django 文档

<块引用>

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

此问题的解决方案是编写一个函数,将存储在数据库中的时间转换为您的本地时间。

from django.utils import timezone
import pytz

def get_localtime(utctime):
    utc = utctime.replace(tzinfo=pytz.UTC)
    localtz = utc.astimezone(timezone.get_current_timezone())
    return localtz

现在可以了

now = get_localtime(datetime.now())
p = People(name='foo', lastname='bar', _date=now)
p.save()