在Django中过滤具有日期时间范围(00:00到23:59:99)的对象

时间:2015-11-16 13:08:16

标签: python django django-models django-queryset django-timezone

我使用django模型过滤器和日期。

原始数据有非洲/阿比让的时间(UTC + 00:00),我将这些数据保存在我的数据库中。

我设置了关于亚洲/首尔的时区(UTC + 09:00),它在我的数据库中保存得很好。

但是我使用time_range = [2015-11-15,2015-11-16]过滤数据,我得到的数据是从15点钟到14点钟。我希望从0 o'时钟到23 o'时钟。

我怎么能得到这个?我做this url,但效果不好。

class Post(models.Model):
    created_time = models.DateTimeField()

如果我有一个像post这样的模型,我会从用户那里得到日期。

input_date = '2015-11-16' (from user)
from_date = datetime.strptime(input_date, '%Y-%m-%d').date()
to_date = from_date + datetime.timedelta(days=1)
posts = Post.objects.filter(created_time__range=[from_date, to_date])

我使用了上层代码并从2015-11-15 15:00:00到2015-11-16 14:00:00获得了数据。

enter image description here enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

您可以从 2015-11-16 00:00 2015-11-16 23:59:99

from datetime import datetime as dt
import datetime 

input_date = '2015-11-16'
# convert string to datetime
from_date = dt.strptime(input_date, '%Y-%m-%d').date()
# combine `from_date` with min time value (00:00)
from_date = datetime.datetime.combine(from_date, datetime.time.min)
# combine `from_date` with max time value (23:59:99) to have end date
to_date = datetime.datetime.combine(from_date, datetime.time.max)
posts = Post.objects.filter(created_time__range=(from_date, to_date))

您也可以使用:

from datetime import datetime

input_date = '2015-11-16'
# convert string to datetime
from_date = datetime.strptime(input_date, '%Y-%m-%d').date()
posts = Post.objects.filter(
    created_time__year=from_date.year, 
    created_time__month=from_date.month,
    created_time__day=from_date.day,
)

在您的情况下,请使用:

datetime.datetime.combine(from_date,datetime.time.max).replace(tzinfo=timezone.utc)