【问题标题】:RuntimeWarning: DateTimeField Model.date received a naive datetime while time zone support is activeRuntimeWarning:DateTimeField Model.date 在时区支持处于活动状态时收到了一个简单的日期时间
【发布时间】:2021-12-01 13:57:37
【问题描述】:

我正在尝试过滤一个查询集以获取今年的所有帖子。

def thisYearQuerySet(objects):
    start_day = datetime.date(datetime.date.today().year, 1, 1)
    end_day = datetime.date(datetime.date.today().year, 12, 31)
    return objects.filter(date__range=[start_day, end_day])

django 抱怨 start_dayend_day 声明可能会冲突 django.utils.timezone,我认为这没什么大不了的。


但警告很烦人,任何关于解除它的建议(不禁用 django 警告)将不胜感激。比如,如何从django.utils获得一年中的第一天和最后一天

完全警告

RuntimeWarning: DateTimeField Model.date received a naive datetime (2021-01-01 00:00:00) while time zone support is active.
RuntimeWarning: DateTimeField Model.date received a naive datetime (2021-12-31 00:00:00) while time zone support is active.

【问题讨论】:

    标签: python django datetime django-timezone


    【解决方案1】:

    django 抱怨 start_day 和 end_day 声明可能与 django.utils.timezone 冲突,我认为这没什么大不了的。

    这取决于您能接受的风险水平。通过不考虑用户的时区,thisYearQuerySet 可能会在您临近新年时返回去年或当年的对象。

    这是因为服务器可能在 GMT 时间运行,这意味着在 2022-01-01 00:00:00T00:00,它将开始返回日期为 2022 年的数据。但是任何使用该应用程序的美国人都会已经知道 2021 年有 4 个多小时了,并且希望在他们自己的午夜之前看到 2021 年的数据。

    但是,如果您试图消除警告并且不关心上述情况,请不要在获取今天/现在时使用 python 日期时间函数。使用:

    from django.utils import timezone
    now = timezone.now()
    today = timezone.now().date()
    

    【讨论】:

    • 干杯,但是 today = timezone.now() start_day = datetime.date(today.year, 1, 1) 不会消除错误。
    • 啊,你是对的。您需要本地化日期时间。如果您使用的是 django 3.2,则可以使用 import pytz; start_day = pytz.UTC.localize(start_day),但同样是任意选择时区。
    • start_day = pytz.timezone('Asia/Shanghai').localize((datetime.datetime(today.year, 1, 1))) 工作
    猜你喜欢
    • 2012-07-18
    • 2020-09-19
    • 2018-05-14
    • 2016-10-03
    • 2019-07-23
    • 2020-10-13
    • 2020-06-19
    • 2017-12-05
    • 2014-12-03
    相关资源
    最近更新 更多