Django 过滤器 __date 时区感知

标签 django datetime timezone

认为

  • 我正在使用 Django 2.x 并使用默认设置。即,TIME_ZONE = 'UTC'USE_TZ = True
  • 我正在夏威夷檀香山记录数据,这意味着檀香山的 2019-4-9 晚上 9 点(用户时间)是 UTC(服务器时间)的 2019-4-10

  • 现在我想按 2019-4-9 Honolulu 时间(用户时间)过滤

    这是一个演示代码

    class TimelineTable(models.Model):
        accessed = models.DateTimeField(auto_now_add=True)
    
        def __str__(self):
            return f'{self.accessed}'
    

    这是TimelineTable中的数据(记录在 2019-4-9檀香山时间)
    ID      accessed       
    1       2019-04-10 07:19:30.319881 
    2       2019-04-10 07:19:35.004506
    3       2019-04-10 07:19:37.612088
    

    不考虑时区,获取数据工作正常

    >>> TimelineTable.objects.filter(accessed__date=datetime.date(2019, 4, 9))
    <QuerySet []>
    >>> TimelineTable.objects.filter(accessed__date=datetime.date(2019, 4, 10))
    <QuerySet [<TimelineTable: 2019-04-10 07:19:30.319881+00:00>, <TimelineTable: 2019-04-10 07:19:35.004506+00:00>, <TimelineTable: 2019-04-10 07:19:37.612088+00:00>]>
    

    现在的问题是时区。

    我在和服务器说话:嘿,给我那些我在 2019-4-9 在檀香山录制的条目。

    >>> Honolulu = pytz.timezone("Pacific/Honolulu")
    >>> t = datetime.datetime(2019, 4, 9, tzinfo=Honolulu)
    >>> TimelineTable.objects.filter(accessed__date=t)
    <QuerySet []>
    

    我预计有 3 个条目,但没有任何 react 。

    如何获得这些条目,没有任何错误?

    最佳答案

    我认为这应该有效:

    t = datetime.datetime(2019, 4, 9, 14, 00, 00, tzinfo=Honolulu)
    d = t.astimezone(pytz.UTC)
    TimelineTable.objects.filter(accessed__date=d.date())
    # OR 
    TimelineTable.objects.filter(accessed__gte=t)
    

    以下代码将不是 工作:
    t = datetime.datetime(2019, 4, 9, tzinfo=Honolulu)
    d = t.astimezone(pytz.UTC)
    TimelineTable.objects.filter(accessed__date=d.date())
    

    解释

    当您生成 datetime.datetime(2019, 4, 9) ,它将返回时间 datetime.time(0, 0) .当您将其转换为 UTC 时,日期不会改变,因为它不是 UTC 和檀香山之间的时差不是 24 小时。

    关于Django 过滤器 __date 时区感知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55607796/

    相关文章:

    DjangoRestFramework - 如何使用模型序列化程序访问 OneToOneField 反向关系的其他字段?

    django-hvad - 我应该如何在保存模型实例时设置翻译字段值?

    ruby - 导轨 4 : column reference "updated_at" is ambiguous with Postgres

    python - "How to convert a Duration(ex. 2h 50m, 8h 35m) an object column in a dataframe into a datetime column with only minutes?"

    python - 如何在 Django 中将 UTC 时间转换为用户本地时间?

    Oracle如何将任何时区的时间戳转换为数据库服务器时区的日期

    javascript - Django 表单操作参数中 PK 的替代方案

    python - 为 Wagtail 问题提供引导轮播

    c# - 仅选择美国时区

    mysql - UTC 数据库中 IST 数据按小时求和值