Django的麻烦不必要地增加了5个小时的日期时间。

时间:2015-02-02 21:25:45

标签: python django datetime

我正在使用一个有帖子(粘滞便笺)对象的应用程序。这是帖子模型。

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)

当我创建具有特定开始时间的帖子时,假设下午3点,那么我因此在调试控制台中获得2015年2月20日星期五15:00:00 GMT-0500。但是在数据库中,它保存为20:00:00。当我将帖子显示在屏幕上时,会显示数据库时间为20:00:00。

在settings.py中,我更改了:

TIME_ZONE = None

USE_I18N = True

USE_L10N = True

USE_TZ = False

但问题仍然存在,我不知道如何解决它。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

这是因为存储在数据库中的日期时间是识别,在日期和时间数据中,它还存储时区。打印感知日期时间对象时,您得到的就是时间点,但是在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()返回当地时间(-6小时)内的datetime对象。 识别对象以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>)