在 Django 中比较日期和日期时间

问题描述 投票:0回答:3

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

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 会以某种方式处理它吗?

python django django-models django-filter
3个回答
30
投票

从2015年的某个时候开始:

YourModel.objects.filter(some_datetime__date=some_date)

即日期时间字段后的 __date。

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


15
投票

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

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() )。有帮助吗?


0
投票

试试这个

from datetime import datetime
now=datetime.now()
YourModel.objects.filter(datetime_published=datetime(now.year, now.month, now.day))
© www.soinside.com 2019 - 2024. All rights reserved.