直接从postgres过滤给定日期(时区识别日期时间)的数据

时间:2019-02-03 07:50:08

标签: django postgresql

我想过滤第二天(了解时区)的所有数据。

假设:

  • 服务器数据位于特定时区
  • 客户端查询来自不同时区

我当前的做法是:

date = received_date_timezone_aware # any time of that day
lower = date.replace(hour=0,minute=0,second=0)
upper = lower + datetime.timedelta(day=1)

data = Model.objects.filter(date__gte=lower, date__lt=upper)

问题

是否有使用Django orm或原始查询的直接解决方案?

注意:我想知道是否有更好的方法可以为自己节省一些操纵日期时间的代码

1 个答案:

答案 0 :(得分:2)

不,没有。但是,您执行的操作也不是最佳方法,因为使用replace可能会导致日光节约的可能性。我建议使用lower = received_date_timezone_aware.date()

这假设Model.dateDateField。如果是约会时间,请执行以下操作:

from datetime import time, datetime

def min_datetime(date: datetime, tz):
    """Get the min datetime of the given datetime and timezone.

    :return datetime: Minimum datetime of the given date.
    """
    return tz.localize(
        datetime.combine(date.astimezone(tz).date(), time.min))


def max_datetime(date: datetime, tz):
    """Get the max datetime of the given datetime and timezone.

    :return datetime: Maximum datetime of the given date.
    """
    return tz.localize(
        datetime.combine(date.astimezone(tz).date(), time.max))

Model.objects.filter(date__range=(min_datetime(value, tz), max_datetime(value, tz)))