【问题标题】:Postgresql recording datetimes incorrectly with DjangoPostgresql 使用 Django 错误地记录日期时间
【发布时间】:2015-07-19 01:35:50
【问题描述】:

所以我有以下要保存的数据,以以下格式开头:

2015-07-26T17:00:00-0700

在我的应用程序的一个视图中,我使用parser

from dateutil import parser
date = parser.parse('2015-07-26T17:00:00-0700')

这会返回:

2015-07-26 17:00:00-07:00

这个想法是让它成为一个 DateTime 对象。在此之后,我将其保存到我的数据库中,如下所示:

  d = Events(name=event["name"],
           location=event["location"],
           description=event["description"],
           event_time=date,
           end_time=event.get("end_time", 'None'),
           eventimage_url=event["cover"]["source"])
  d.save()

然后当我查询数据库时

event_list = Events.objects.all()
print event_list[0].event_time ## There is only one record in the database

我得到以下信息:

2015-07-27 00:00:00+00:00

看起来 Postgresql 正在对我的数据库中的时间进行四舍五入,我不希望它这样做。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'MY_APPLICATION',
        'USER': 'MY_NAME',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '',
    }
}

以下是用于创建我的数据库的语句:

BEGIN;
CREATE TABLE "App_events" ("id" serial NOT NULL PRIMARY KEY, "name" varchar(128) NOT NULL, "location" varchar(128) NOT NULL, "description" varchar(10000) NOT NULL, "event_time" timestamp with time zone NOT NULL, "end_time" varchar(128) NOT NULL, "eventimage_url" varchar(300) NOT NULL);
COMMIT;

这就是我的模型的设计方式:

class Events(models.Model):
  name = models.CharField(max_length=128)
  location = models.CharField(max_length=128)
  description = models.CharField(max_length=10000)
  event_time = models.DateTimeField()
  end_time = models.CharField(max_length=128)
  eventimage_url = models.CharField(max_length=300)

有人知道如何解决这个问题吗?

【问题讨论】:

  • 不是四舍五入。它正在转换为 UTC。

标签: python django postgresql datetime


【解决方案1】:

我相信时间是正确的,没有任何问题 - 数据库服务器中的时间以 UTC 形式返回给您(因为它被设置为以这种方式存储它)而不是 -7 - 如果您设置它到正确的时区你将不再有问题 - 但通常最好的做法是存储在 UTC

您可以使用 pytz 之类的库将任何检索到的值设置为任何时区

from pytz import timezone
my_adjusted_date = timezone(valid_timezone).localize(datetime_value)

【讨论】:

    【解决方案2】:

    对于遇到类似问题的任何人,您必须更改setting.py 文件中的TIME_ZONE。从 TZ 列使用here

    【讨论】:

    • 如果您希望始终将信息存储在特定时区,这也是一个解决方案。
    猜你喜欢
    • 2012-03-17
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 2020-07-06
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多