Django 不必要地向日期时间添加 5 小时的问题。

Trouble with Django unnecessarily adding 5 hours to date time.

我正在使用一个具有 post(便签之类)对象的应用程序。这是 post 模型。

class Post(models.Model):
author = models.ForeignKey(Account)
content = models.CharField(max_length=40)
start_time = models.DateTimeField()

created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

def __unicode__(self):
    return '{0}'.format(self.content)

当我创建具有特定开始时间的 post 时,假设是下午 3 点,那么我相应地在调试控制台中得到 Fri Feb 20 2015 15:00:00 GMT-0500。但是在数据库中,它被保存为20:00:00。当我在屏幕上显示 post 时,显示的是 20:00:00.

的数据库时间

在settings.py中,我修改了:

TIME_ZONE = None

USE_I18N = True

USE_L10N = True

USE_TZ = False

但是问题依旧,不知道怎么解决。

这是因为存储在数据库中的日期时间是 感知的,因为除了日期和时间数据,它还存储时区。打印感知日期时间对象时,您得到的是那个时间点,但在 UTC 时区(因此是 5 小时增量)。

>>> from datetime import datetime
>>> from django.utils.timezone import now

>>> datetime.now()
datetime.datetime(2015, 2, 2, 15, 29, 10, 202480)

>>> now()
datetime.datetime(2015, 2, 2, 21, 29, 11, 459850, tzinfo=<UTC>)

如您所见,datetime.now() returns 日期时间对象处于我的本地时间(-6 小时)。 aware 对象以 UTC 时区表示,比我的本地时区晚 6 小时。

如果您想使其进入当地时区,请使用 django.utils.timezone.localtime:

>>> from django.utils.timezone import now, localtime
>>> localtime(now())
datetime.datetime(2015, 2, 2, 15, 31, 25, 666377, tzinfo=<DstTzInfo 'America/Chicago' CST-1 day, 18:00:00 STD>)

Django 在数据库中将日期存储为 UTC,因此时间 20:00 是正确的。如果您希望所有日期都显示为 GMT-0500 时区,您应该设置 TIME_ZONE 设置和 USE_TZ = True... 否则目前 Django 不知道您想要的时区并且它会由您自行规范化任何日期,例如在视图代码中。