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 不知道您想要的时区并且它会由您自行规范化任何日期,例如在视图代码中。
我正在使用一个具有 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 不知道您想要的时区并且它会由您自行规范化任何日期,例如在视图代码中。