【问题标题】:django datetimefield and postgresdjango datetimefield 和 postgres
【发布时间】:2017-02-10 14:55:59
【问题描述】:

我有以下型号和形式

class TravelShare(Share):  # indirect derived via Share from models.Model
    source = models.PointField(geography=True, srid=4326)
    destination = models.PointField(geography=True, srid=4326)
    departure = models.DateTimeField(default=timezone.now)
    departure_delta = models.SmallIntegerField(default=60)

    objects = TravelShareManager()

    def __str__(self):
        return self.id

class TravelShareForm(forms.ModelForm):

    class Meta:
        model = TravelShare
        fields = ['source', 'destination', 'departure', 'departure_delta']

使用

测试表单时
def test_TravelShareCreate(self):

    source = Point(x=48.0, y=11.0, srid=4326)
    destination = Point(x=48.0001, y=11.0001, srid=4326)
    now = timezone.localtime(timezone.now())
    print ("now : %s" % (now))
    now_string = now.strftime('%m.%d.%Y %H:%M:%S')

    form_data = {

        'source': source,
        'destination': destination,
        'departure': now_string,
        'departure_delta': 30,

    }

    form = TravelShareForm (form_data)
    print (form.errors)
    self.assertTrue(form.is_valid())

    form.instance.creator = self.creator
    result = form.save()
    self.assertEqual(result.creator_id, self.creator.id)
    self.assertEqual(result.source, source)
    self.assertEqual(result.destination, destination)
    result_dep = timezone.localtime(result.departure)
    print("result_dep : %s" % (result_dep))
    self.assertEqual(result.departure, now)

我终于来了

现在 : 2017-02-10 15:49:21.935894+01:00

result_dep : 2017-10-02 15:49:21+02:00

失败

Traceback(最近一次调用最后一次): 文件“/home/michael/PycharmProjects/sharadar/main/tests/test_forms.py”,第 43 行,在 test_TravelShareCreate self.assertEqual(result.departure, now) AssertionError: datet[14 chars]017, 10, 2, 15, 49, 21, tzinfo=DstTzInfo 'Eur[25 chars]DST) != datet[14 chars]017, 2, 10, 15, 49, 21, 935894 , tzinfo=DstTzI[32 个字符]STD

结果 DateTime 似乎有不同的 TZ 或至少显示 +2 而不是 +1

感谢您的帮助

迈克尔

【问题讨论】:

  • 我找到了。数据库的结果四舍五入到秒,因此 15:49.21.93894+1.00 变为 15:49:21+02:00

标签: django postgresql datetime


【解决方案1】:

数据库的结果四舍五入到秒,因此 15:49.21.93894+1.00 变为 15:49:21+02:00

这是完全错误的。在将 datetime 对象转换为字符串 now.strftime('%m.%d.%Y %H:%M:%S') 期间,您已经删除了微秒部分。 而且,+02:00 是 datetime 对象的时区 UTC 偏移量。这不是四舍五入的秒数。

真正的问题在于您的 strftime 字符串格式。今天,您的时区可能有夏令时。但是,当您将格式错误的日期时间字符串传递给表单时,django 表单会将其解析为 2017-10-02(2017 年 10 月 2 日),这是您所在时区的标准时间。所以,这就是你得到不同 UTC 偏移量的原因:+01:00 和 +02:00。

【讨论】:

  • 你是对的。我已经用新的测试更新了我的回复,现在在这两种情况下都使用 strftime('%d.%m.%Y %H:%M:%S')
【解决方案2】:

数据库的结果四舍五入到秒,因此 15:49.21.93894+1.00 变为 15:49:21+02:00

除了 strftime 格式字符串应该是 :('%d.%m.%Y %H:%M:%S') 而不是 ('%m.%d.%Y %H:% M:%S')

我的测试现在是这样的:

class TestTravelShareForm(TestCase):

def setUp(self):
    self.creator = ShrUser.objects.create_user(username="foo", email="hallo.ich@localhost.de", password="bla")
    self.source = Point(x=48.0, y=11.0, srid=4326)
    self.destination = Point(x=48.0001, y=11.0001, srid=4326)
    self.now = timezone.now()
    self.now_string = self.now.strftime('%d.%m.%Y %H:%M:%S')

def test_TravelShareCreate(self):

    form_data = {

        'source': self.source,
        'destination': self.destination,
        'departure': self.now_string,

    }

    form = TravelShareForm (form_data)
    self.assertTrue(form.is_valid())

    form.instance.creator = self.creator
    result = form.save()

    self.assertEqual(result.creator_id, self.creator.id)
    self.assertEqual(result.source, self.source)
    self.assertEqual(result.destination, self.destination)

    result_dep = result.departure.strftime('%d.%m.%Y %H:%M:%S')

    self.assertEqual(result_dep, self.now_string)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 2015-02-04
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多