【问题标题】:Date range and naive datetime throw Runtimewarning日期范围和天真的日期时间抛出 Runtimewarning
【发布时间】:2012-12-27 18:19:12
【问题描述】:

给定今天的日期范围以过滤 Django 中的条目:

today_min = datetime.datetime.combine(timezone.now(), datetime.time.min)
today_max = datetime.datetime.combine(timezone.now(), datetime.time.max)
today_events = Entry.objects.filter(due_date_time__range=(today_min, today_max))

为了考虑时区支持,我显然使用timezone.now() 而不是datetime.date.today(),但我仍然收到错误消息:

RuntimeWarning: DateTimeField received a naive datetime (2013-01-13 00:00:00) while time zone support is active.

RuntimeWarning: DateTimeField received a naive datetime (2013-01-13 23:59:59.999999) while time zone support is active.

我忽略了什么?谢谢

【问题讨论】:

    标签: python django


    【解决方案1】:

    根据 Python 3.2 中 datetime 模块的来源,datetime.datetime.combine 的结果是这样构造的:

    @classmethod
    def combine(cls, date, time):
        ...
    
        return cls(date.year, date.month, date.day,
                   time.hour, time.minute, time.second, time.microsecond,
                   time.tzinfo)
    

    所以这里不尊重 tzinfo,你使用 combine 函数的方式(如果 Python 2.X 版本的 datetime 以 3.2 版本的方式执行)。

    要获得本地化的日期时间对象,Django docs 建议这样做:

    from django.utils import timezone
    timezone.localtime(timezone.now())
    

    【讨论】:

      猜你喜欢
      • 2018-10-20
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 2017-07-29
      • 2023-01-10
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      相关资源
      最近更新 更多