【问题标题】:Compare date and datetime in Django比较 Django 中的日期和日期时间
【发布时间】:2012-04-20 08:25:09
【问题描述】:

我有一个带有日期时间字段的模型:

class MyModel(models.Model):
    created = models.DateTimeField(auto_now = True)

我想获取今天创建的所有记录。

我试过了:

MyModel.objects.all().filter(created = timezone.now())

MyModel.objects.all().filter(created = timezone.now().date())

但总是得到一个空集。 Django 中执行此操作的正确方法是什么?

编辑:

看起来很奇怪,但是今天创建的记录 (06.04.2012 23:09:44) 在数据库中有日期 (2012-04-07 04:09:44)。当我尝试在管理面板中对其进行编辑时,它看起来是正确的(06.04.2012 23:09:44)。 Django 会以某种方式处理它吗?

【问题讨论】:

  • 听起来您遇到了时区问题。根据documentation django 存储日期,数据库中的时区信息为UTC。

标签: python django django-models


【解决方案1】:

从 2015 年的某个地方开始:

YourModel.objects.filter(some_datetime__date=some_date)

即__date 在日期时间字段之后。

https://code.djangoproject.com/ticket/9596

【讨论】:

【解决方案2】:

可能有更合适的解决方案,但快速检查表明这是可行的:

from datetime import timedelta

start_date = timezone.now().date()
end_date = start_date + timedelta( days=1 ) 
Entry.objects.filter(created__range=(start_date, end_date))

我假设时区是一个类似日期时间的对象。

重要的是,您要存储精确的时间,精确到毫秒,然后将其与仅精确到当天的时间进行比较。 django/python 不会折腾小时、分钟和秒,而是将它们默认为 0。因此,如果您的记录是在 2011-4-6T06:34:14am 创建的,那么它会比较 2011-4-6T:06:34:14am到 2011-4-6T00:00:00,而不是 2011-4-6(从创建日期开始)到 2011-4-6(从 timezone.now().date() 开始)。有用吗?

【讨论】:

  • 知道了...看起来很奇怪,但是今天创建的记录 (06.04.2012 23:09:44) 在数据库中有日期 (2012-04-07 04:09:44)。 Django 会以某种方式处理它吗?
  • @Just_Mad,是的,django 将所有内容作为 UTC 存储在数据库中。
  • 时区应该从哪个导入?
【解决方案3】:

试试这个

from datetime import datetime
now=datetime.now()
YourModel.objects.filter(datetime_published=datetime(now.year, now.month, now.day))

【讨论】:

  • 行不通,您仍将 2011-04-06TXX:XX:XX 与 2011-04-06T00:00:00 进行比较。这将是错误的,返回 None。
  • 我不明白它应该如何工作。它完全等同于“SELECT * FROM table WHERE date='2002-04-05'”
  • YourModel.objects.filter(created__published=datetime(now.year, now.month, now.day)),我说的对吗?
  • 删除 __published 它只是一个名称的例子,使用 YourModel.objects.filter(created=datetime(now.year, now.month, now.day))
  • 好吧,它也无济于事。请查看我的问题的编辑。希望这可以清除情况。
猜你喜欢
  • 2020-12-16
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多