代码之家  ›  专栏  ›  技术社区  ›  Sabbiu Shah

直接从postgres中筛选给定日期(时区感知日期时间)的数据

  •  0
  • Sabbiu Shah  · 技术社区  · 7 年前

    我想过滤第二天的所有数据(这是时区感知的)。

    假设:

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

    我目前的做法是:

    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)
    

    问题

    注: 我想知道是否有更好的方法可以节省我自己操作日期时间的几行代码

    1 回复  |  直到 7 年前
        1
  •  2
  •   schillingt    7 年前

    不,没有。然而,您所做的并不是最好的方法,因为使用replace可能会导致一些奇怪的现象,从而节省日间照明。我建议使用 lower = received_date_timezone_aware.date() .

    这假设 Model.date DateField . 如果是日期时间,则执行以下操作:

    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)))